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 {
public String hi() { return A.super.hi() + B.super.hi(); }
}
- A
AB - B
A - C
B - D コンパイルエラーになる
正解と解説を見る
正解: A
- A: C は hi() をオーバーライドし、A.super.hi() と B.super.hi() で両方のデフォルトメソッドを呼んでいるので AB です。
- B: B.super.hi() も呼んで連結しているので、A だけにはなりません。
- C: A.super.hi() も呼んで連結しているので、B だけにはなりません。
- D: 同じデフォルトメソッドが衝突しても、C でオーバーライドしているのでコンパイルできます。インタフェース名.super.メソッド名() で指定して呼べます。
ポイント
- 同じ default メソッドを持つインタフェースを2つ実装すると、オーバーライドが必須です。
- 特定のインタフェースの実装は
A.super.hi()の形で呼べます。
「デフォルト・メソッドとプライベート・メソッドの使用」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)