56

这种新的界面模型是如何工作的以及是关于什么的

  • 可能由此产生的钻石问题
  • 此实现的多重继承特性
  • 以及使用接口实现的优先级?
4

2 回答 2

65

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按照“最具体实现”规则继承的实现。但是如果BC都提供默认实现,那么它们会发生冲突,并且D必须使用语法X.super.m(...)来显式选择其中之一,或者重新声明方法本身,覆盖所有超类型声明。

请务必查看之前关于解决冲突方法声明的规则的文章以及关于 Java Lambda 项目的其他文章——它们非常好。

于 2013-05-28T09:18:12.697 回答
14

Java 8的新接口模型&多重继承的菱形问题详细解释如下。

正如您在这个示例中所看到的,从JDK 8开始,Java 引入了一种多重继承,因为 及其接口可能包含相同方法的 实现(相同的名称和签名)。为了解决菱形问题,使用实现的顺序有一个优先级:只有当类实现了其接口的所有默认/可选方法时,才能编译代码并使用此类的实现。否则编译器会尝试使用接口的默认实现来修补缺失的实现. 如果一个方法有多个默认实现,那么就会出现菱形问题,编译器会拒绝编译。
Java 8 的新接口模型是接近 向后兼容性的结果,即保持针对 Java 8 之前的接口编写的现有代码可编译。

于 2013-05-26T23:58:43.493 回答