預設方法多重繼承衝突
考慮下一個例子:
public interface A {
default void foo() { System.out.println("A.foo"); }
}
public interface B {
default void foo() { System.out.println("B.foo"); }
}
這裡有兩個介面,用相同的簽名宣告 default
方法 foo
。
如果你嘗試在新介面中使用這兩個介面,則必須選擇兩個,因為 Java 會強制你明確解決此衝突。
首先,你可以使用與 abstract
相同的簽名宣告方法 foo
,這將覆蓋 A
和 B
行為。
public interface ABExtendsAbstract extends A, B {
@Override
void foo();
}
當你在 class
中發現時,你必須提供 foo
實現:
public class ABExtendsAbstractImpl implements ABExtendsAbstract {
@Override
public void foo() { System.out.println("ABImpl.foo"); }
}
或者第二,你可以提供全新的 default
實現。你還可以通過從實現類中訪問重寫的預設方法來重用 A
和 B
foo
方法的程式碼。
public interface ABExtends extends A, B {
@Override
default void foo() { System.out.println("ABExtends.foo"); }
}
當你在 class
中播出時,你將會提供 foo
的實現:
public class ABExtendsImpl implements ABExtends {}