And*_*yle 133
协变返回意味着当一个覆盖一个方法时,覆盖方法的返回类型被允许是被覆盖方法的返回类型的子类型.
为了用一个例子来澄清这一点,一个常见的例子是Object.clone()- 声明返回一种类型Object.你可以在你自己的类中覆盖它,如下所示:
public class MyFoo
{
...
// Note covariant return here, method does not just return Object
public MyFoo clone()
{
// Implementation
}
}
Run Code Online (Sandbox Code Playgroud)
这里的好处是任何持有对MyFoo对象的显式引用的方法都能够调用clone()并知道(不强制转换)返回值是其实例MyFoo.如果没有协变返回类型,MyFoo中的重写方法必须声明为返回Object- 因此调用代码必须显式地向下转换方法调用的结果(甚至认为双方"知道"它只能是MyFoo的一个实例).
请注意,没有什么特别的,clone()并且任何重写的方法都可以有一个协变返回 - 我在这里使用它作为一个例子,因为它是一个标准的方法,这通常是有用的.
Moh*_*ANE 35
这是另一个简单的例子:
Animal 类
public class Animal {
protected Food seekFood() {
return new Food();
}
}
Run Code Online (Sandbox Code Playgroud)
Dog 类
public class Dog extends Animal {
@Override
protected Food seekFood() {
return new DogFood();
}
}
Run Code Online (Sandbox Code Playgroud)
这是可能的修改的返回类型Dog的seekFood()方法DogFood-的一个子类Food,如下所示:
@Override
protected DogFood seekFood() {
return new DogFood();
}
Run Code Online (Sandbox Code Playgroud)
这完全是一个合法的覆盖,并且返回类型Dog的seekFood()方法被称为协变返回类型.
小智 7
从JDK 1.5的发布版开始,Java中引入了协变类型.我将用一个简单的例子向你解释:当我们覆盖一个函数时,允许函数对它的行为进行更改,这是你在大多数书中读到的内容,但是他们{作者}错过了什么是我们也可以改变返回类型.检查下面的链接以便澄清我们可以更改返回类型,只要它可以分配给方法的基本版本的返回类型.
所以返回派生类型的这个特性叫做COVARIANT ......
小智 6
covariant返回类型只是表示返回自己的Class引用或其子类引用.
class Parent {
//it contain data member and data method
}
class Child extends Parent {
//it contain data member and data method
//covariant return
public Parent methodName() {
return new Parent();
or
return Child();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64643 次 |
| 最近记录: |