【发布时间】:2018-08-23 15:30:09
【问题描述】:
在过去(Java 7 及之前),Java 类和接口扮演不同的角色:用于抽象方法实现的类;用于抽象对象结构的接口。但是,从 Java 8 开始,接口现在可以使用默认方法定义方法实现。这导致了一个称为“钻石问题”的问题。
带有方法execute() 的接口A 由包含execute() 的默认实现的接口B 和C 扩展。如果一个类随后实现了B 和C,则应该运行execute() 的哪个默认实现存在歧义。
interface A {
public void execute();
}
interface B extends A {
default void execute() { System.out.println("B called"); }
}
interface C extends A {
default void execute() { System.out.println("C called"); }
}
class D implements B, C {
}
鉴于上面的类定义,当(new D()).execute() 被执行时,将打印什么(如果有的话):“B called”还是“C called”?
【问题讨论】:
-
你的问题是?
-
我投票决定将此问题作为离题结束,因为这不是一个问题。这是一种尝试记录自 Java 8 以来已知和记录在案的附带问题。
-
刚刚编辑以正确定义问题:在运行
(new D()).execute()时,会调用来自B或C的execute()实现。 -
这个问题不用问,用你的java编译器编译一下就行了。
-
啊,没看到那个。
标签: java interface diamond-problem