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