【发布时间】:2016-10-20 20:06:03
【问题描述】:
我正在学习 Java 8,我遇到了一个使用 default 方法的行为,我无法完全理解。
首先,一个“老式”的 Java sn-p 可以完美编译和运行:
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 从A 继承了一个已实现的print(),从B 继承了一个抽象的print(),这被认为是正确实现的。
但是如果A变成interface用default方法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 仍然从A 继承print(),编译器仍会抱怨C 不是abstract(如果A 是如前所示的类,则不会发生同样的事情) .如果C 变成abstract 如下:
abstract class C implements A, B {
public void useInheritedPrint() {
print();
}
}
然后编译器抱怨C 继承了default(来自A)和abstract print()(来自B)。
解决方案是在C 中定义一个abstract print(),如下:
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
}
}
有谁知道在从 interface 继承 default method 和从父类继承它之间是否存在这种不对称行为的特殊原因?
这里是否涉及到致命的死亡钻石(我不明白为什么)?
【问题讨论】:
标签: java inheritance java-8 overriding default-method