默认方法多重继承冲突
考虑下一个例子:
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 {}