在java中,当非协变返回类型产生编译时错误时,为什么协变返回类型是可接受的。当然,如果 JVM 可以处理协变返回类型,那么它就可以处理非协变返回类型。我假设当java看到一个带有协变返回的重写方法时,它只是应用与调用对象关联的方法。为什么非协变返回类型不能发生同样的情况。我的猜测是,这与打破超类方法合同的条款有关,当然,如果允许这样做,那么子类(覆盖)方法的行为就不是很可预测(因为返回类型没有一致性) ?
这是一个示例(假设 DogFood 是 Food 的子类,但 CatFood 不是 Food 的子类):
动物类
public class Animal {
public Food seekFood() {
return new Food();
}
}
狗类
public class Dog extends Animal {
public DogFood seekFood() { //This is OK since its a covariant
return new DogFood();
}
}
猫类
public class Cat extends Animal {
public CatFood seekFood() { // This won't compile. Catfood is not covariant
return new CatFood();
}
}