default メソッドの衝突を放置する
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
System.out.println(new C().hi());
}
}
interface A {
default String hi() { return "A"; }
}
interface B {
default String hi() { return "B"; }
}
class C implements A, B {
}
- A
Aと出力される - B
Bと出力される - C 実行時に例外が発生する
- D コンパイルエラーになる
正解と解説を見る
正解: D
- A: 同じシグネチャのデフォルトメソッドが2つあり、どちらを使うか決まらないのでコンパイルエラーです。実行まで進まないので、何も出力されません。
- B: 実行まで進まないので、何も出力されません。
- C: コンパイルの時点でエラーになるので、実行時の例外にはなりません。
- D: A と B の両方から hi() のデフォルト実装を受け継ぐので、C で hi() をオーバーライドしないとコンパイルエラーになります。
ポイント
- どちらの hi() を使うか決まらないので、C でオーバーライドしないとコンパイルエラーです。
「デフォルト・メソッドとプライベート・メソッドの使用」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)