戻り値の型を変えるオーバーライド
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
System.out.println(new B().value());
}
}
class A {
int value() { return 1; }
}
class B extends A {
long value() { return 2L; }
}
- A
2と出力される - B
1と出力される - C 実行時に例外が発生する
- D コンパイルエラーになる
正解と解説を見る
正解: D
- A: 戻り値の型が合わないオーバーライドなので、コンパイルエラーです。実行まで進まないので、何も出力されません。
- B: 実行まで進まないので、何も出力されません。
- C: コンパイルの時点でエラーになるので、実行時の例外にはなりません。
- D: 引数が同じで戻り値だけ int → long に変えているので、オーバーライドとしてもオーバーロードとしても成り立たずコンパイルエラーです。プリミティブ型の戻り値は同じ型にする必要があります。
ポイント
- オーバーライドの戻り値は、同じ型か そのサブクラス (共変戻り値) でなければなりません。基本データ型は同じ型だけです。