Java中的协变返回类型是什么?在面向对象的编程中?
发布于 2009-12-11 01:24:13
协变返回,意味着当重写一个方法时,重写方法的返回类型可以是被重写方法的返回类型的子类型。
为了通过一个例子来阐明这一点,一个常见的情况是Object.clone() -它被声明为返回一种类型的Object。您可以在自己的类中覆盖它,如下所示:
public class MyFoo
{
...
// Note covariant return here, method does not just return Object
public MyFoo clone()
{
// Implementation
}
}这里的好处是,任何持有对MyFoo对象的显式引用的方法都将能够调用clone(),并知道(无需强制转换)返回值是MyFoo的一个实例。如果没有协变返回类型,MyFoo中被覆盖的方法必须声明为返回Object -因此调用代码必须显式地向下转换方法调用的结果(即使两端都“知道”它只能是MyFoo的一个实例)。
请注意,clone()没有什么特别之处,任何被覆盖的方法都可以有一个协变返回--我在这里以它为例,因为它是一个标准方法,通常很有用。
发布于 2015-09-15 03:36:34
下面是另一个简单的例子:
Animal类
public class Animal {
protected Food seekFood() {
return new Food();
}
}Dog类
public class Dog extends Animal {
@Override
protected Food seekFood() {
return new DogFood();
}
}可以将Dog的seekFood()方法的返回类型修改为DogFood - Food的子类,如下所示:
@Override
protected DogFood seekFood() {
return new DogFood();
}这完全是合法的覆盖,Dog的seekFood()方法的返回类型称为协变返回类型。
发布于 2014-03-19 15:46:33
从JDK 1.5版本开始,Java中引入了协变类型。我会用一个简单的例子向你解释:当我们重写一个函数时,函数被允许改变它的行为,这就是你在大多数书中读到的,但是他们(作者)遗漏的是我们也可以改变返回类型。检查下面的链接澄清我们可以更改返回类型,只要它可以分配给方法的基本版本的返回类型。
因此,这种返回派生类型的功能称为协变...
https://stackoverflow.com/questions/1882584
复制相似问题