class Parent {
Number value() {
return 10;
}
}
class Child extends Parent {
Integer value() {
return 20;
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.value());
}
}
選択肢
- あなたの回答
- 正解
正解
B. 20
詳細解説
戻り値型は、親メソッドの戻り値型のサブタイプであればオーバーライドできます。Integer は Number のサブタイプです。実行時には実体である Child の value が呼ばれ、20 が表示されます。
なぜ他の選択肢が違うのか
- 参照型が Parent でも、オーバーライドされたインスタンスメソッドは実体の型で決まります。
- 共変戻り値が認められるため、このコードはコンパイルできます。
- キャスト処理をしていないため ClassCastException は発生しません。
罠ポイント
変数の型と実体の型を分けて考えましょう。フィールドや static メソッドとは解決のされ方が違います。