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();
}
}