預設方法多重繼承衝突
考慮下一個例子:
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 {}