这种新的界面模型是如何工作的以及是关于什么的
- 可能由此产生的钻石问题
- 此实现的多重继承特性
- 以及使用接口实现的优先级?
Java Lambda FAQ有一个完美的解释。
这是钻石问题的引文?那里的文章:
interface A {
default void m() { ... }
}
interface B extends A {}
interface C extends A {}
class D implements B, C {}
在最初的情况下(上面的代码),由D继承的m的实现明确地是由A定义的——没有其他可能性。如果情况发生变化,B现在也声明了m的默认实现,这将成为D按照“最具体实现”规则继承的实现。但是如果B和C都提供默认实现,那么它们会发生冲突,并且D必须使用语法X.super.m(...)来显式选择其中之一,或者重新声明方法本身,覆盖所有超类型声明。
请务必查看之前关于解决冲突方法声明的规则的文章以及关于 Java Lambda 项目的其他文章——它们非常好。
Java 8的新接口模型&多重继承的菱形问题详细解释如下。
正如您在这个示例中所看到的,从JDK 8开始,Java 引入了一种多重继承,因为 类及其接口可能包含相同方法的 实现(相同的名称和签名)。为了解决菱形问题,使用实现的顺序有一个优先级:只有当类实现了其接口的所有默认/可选方法时,才能编译代码并使用此类的实现。否则编译器会尝试使用接口的默认实现来修补缺失的实现. 如果一个方法有多个默认实现,那么就会出现菱形问题,编译器会拒绝编译。
Java 8 的新接口模型是接近 向后兼容性的结果,即保持针对 Java 8 之前的接口编写的现有代码可编译。