什么是协变返回类型?
2022-08-31 09:05:34
Java 中的协变返回类型是什么?在一般的面向对象编程中?
协变返回意味着当重写方法时,重写方法的返回类型允许为重写方法的返回类型的子类型。
为了通过示例来澄清这一点,一个常见情况是 - 它被声明为返回一种类型。您可以在自己的类中重写它,如下所示:Object.clone()
Object
public class MyFoo
{
...
// Note covariant return here, method does not just return Object
public MyFoo clone()
{
// Implementation
}
}
这里的好处是,任何对MyFoo对象进行显式引用的方法都将能够调用并知道(无需强制转换)返回值是 的实例。如果没有协变返回类型,MyFoo中被覆盖的方法必须声明为返回 - 因此调用代码必须显式下放方法调用的结果(甚至认为双方都“知道”它只能是MyFoo的一个实例)。clone()
MyFoo
Object
请注意,没有什么特别之处,任何被覆盖的方法都可以有一个协变返回 - 我在这里用它作为一个例子,因为它是一个标准方法,这通常是有用的。clone()
这是另一个简单的例子:
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()