鑽石問題
interface A {
default void m() { ... }
}
interface B extends A {}
interface C extends A {}
class D implements B, C {}
根據上一章節說明的默認方法選擇規則,在類似這種場景中Java會有一種簡單直接的解釋方法。
interface A {
default void m() { System.out.println("hello from A"); }
}
interface B extends A {
default void m() { System.out.println("hello from B"); }
}
interface C extends A {}
class D implements B, C {}
下面的代碼:
C c = new D();
c.m();
將會打印出hello from B。靜態的類型C並不重要,關鍵的是實際的類型是D,而D最明確的m聲明是從繼承B而來的。