Java 8的新默认接口模型如何工作(包括菱形,多重inheritance和优先级)?

这个新的界面模型是如何工作的?

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

Java Lambda FAQ有一个完美的解释。
这是一个引用来自钻石问题呢? 那里的文章:

interface A { void m() default { ... } } interface B extends A {} interface C extends A {} class D implements B, C {} 

在最初的情况下(上面的代码),由Dinheritance的m的实现明确地由A定义 – 没有其他可能性。 如果情况发生了变化,那么B现在也声明了m的默认实现, 这就成为D由“最具体的实现”规则inheritance的实现。 但是,如果BC都提供默认实现,那么它们就会发生冲突, D必须使用语法X.super.m(…)来显式select其中的一个,否则重新声明该方法本身,覆盖所有的超types声明。

一定要查看以前关于解决Java Lambda项目中冲突的方法声明和其他文章规则的文章 – 它们相当不错。

这里是对Java 8的新接口模型和多重inheritance的钻石问题的详细解释。

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