我正在研究 Java 8,并且遇到了一种default
我无法完全理解的方法的行为。
首先,一个可以完美编译和运行的“老式”Java 代码片段:
abstract class A {
public void print() {
System.out.println("A");
}
}
interface B {
void print(); // implicitly public and abstract
}
class C extends A implements B {
public void useInheritedPrint() {
print(); // prints A
}
}
C
继承一个实现print()
自和一个被认为正确实现A
的抽象print()
。B
但是如果A
变成了一个interface
withdefault
方法print()
,如下:
interface A {
default void print() { // implicitly public
System.out.println("A");
}
}
interface B {
void print(); // implicitly public and abstract
}
class C implements A,B {
public void useInheritedPrint() {
print(); // should print A
}
}
即使C
仍然继承print()
自A
,编译器也会抱怨事实C
并非如此abstract
(如果是如前所示的类,则不会发生同样的事情A
)。如果C
变成abstract
如下:
abstract class C implements A, B {
public void useInheritedPrint() {
print();
}
}
然后编译器抱怨C
继承了 a default
(from A
) 和 an abstract
print()
(from B
) 的事实。
解决方案是定义一个abstract print()
in C
,如:
class C implements A,B {
public void useInheritedPrint() {
print(); // should print A
}
public abstract void print(); // shall be implemented by a concrete subclass
}
或覆盖print()
,如:
class C implements A,B {
public void useInheritedPrint() {
print(); // should print A
}
public void print() {
// do something
}
}
有谁知道在从 a 继承 a 和从父类继承它之间是否存在这种不对称行为的特殊default method
原因interface
?
这里是否以某种方式涉及致命的死亡钻石(我不明白为什么)?