預設方法多重繼承衝突

考慮下一個例子:

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,這將覆蓋 AB 行為。

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 實現。你還可以通過從實現類中訪問重寫的預設方法來重用 AB foo 方法的程式碼。

public interface ABExtends extends A, B {
    @Override
    default void foo() { System.out.println("ABExtends.foo"); }
}

當你在 class 中播出時,你將會提供 foo 的實現:

public class ABExtendsImpl implements ABExtends {}