Java 8的新默认界面模型如何工作(包括菱形,多重继承和优先级)?

Ale*_*lex 55 java java-8

这个新的界面模型是如何工作的以及它是什么

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

Ann*_*nko 62

Java Lambda FAQ有一个完美的解释.
这是一个关于钻石问题的引用?那篇文章:

interface A {
    void m() default { ... }        
}
interface B extends A {}
interface C extends A {}
class D implements B, C {}
Run Code Online (Sandbox Code Playgroud)

在最初的情况下(上面的代码),由D继承的m的实现明确地由A定义- 没有其他可能性.如果情况发生变化,以便B现在也声明m的默认实现,那么它将成为D "最具体的实现"规则继承的实现.但是如果B和C都提供默认实现,那么它们就会冲突,并且D必须使用语法X.super.m(...)来显式选择其中一个,否则重新声明方法本身,覆盖所有超类型声明.

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

  • 听起来像混乱:(优先? (7认同)
  • 链接是全面的 - 这应该是公认的答案。 (2认同)

Ale*_*lex 14

以下是Java 8的新接口模型和多重继承的钻石问题的详细说明.

正如你可能在这个例子中看到,从JDK 8,Java已经推出了一种多重继承作为两者的 类和它的接口可能包含 执行同样的方法(相同的名称和签名)的.为了解决这个问题的钻石中有何种顺序实现,则使用一个优先级:只有当类实现所有的接口的缺省的/可选的方法,代码可以编译和使用这个类的实现.否则,编译器会尝试使用接口的默认实现来修补缺少的实现.如果方法有多个默认实现,则会发生菱形问题,编译器会拒绝编译.
Java 8的新接口模型是接近向后兼容性的结果  ,即保持针对Java 8接口编写的现有代码可编译.

  • 这真的是对的吗?从@ ruda的回答看[链接](http://www.lambdafaq.org/what-about-the-diamond-problem/):如果在不同级别有多个默认实现,则钻石问题确实不会发生接口层次结构 仅当同一级别存在多个默认实现时.也就是说,只有`B`和`C`实现该方法.这个答案并不清楚. (2认同)