在java中,为什么covariant返回类型在非协变返回类型产生编译时错误时可以接受。当然,如果JVM可以处理协变返回类型,那么它可以处理非协变返回类型。我认为,当java看到一个带有协变返回值的重载方法时,它只会应用与调用对象关联的方法。为什么不能发生同样的非协变返回类型。 我的猜测是,它违背了超类方法合约的条款,当然如果允许这样做,那么子类(重载)方法的行为不是非常可预测的(因为在返回类型中没有一致性)?Java Co-variant返回
下面是一个例子(假设狗食是食品的一个子类,但CATFOOD不是食品的子类):
动物类
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();
}
}
Cat类
public class Cat extends Animal {
public CatFood seekFood() { // This won't compile. Catfood is not covariant
return new CatFood();
}
}
我没有真正明白你的观点。这可能是一个很好的问题,但请用一个例子来解释它。这对我们所有人都会更好。 –