默认方法多重继承冲突

考虑下一个例子:

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 {}