JDK 8 中的缺省值是 Java 中的多重继承形式吗?

JDK 8 中即将推出的新功能允许您添加到现有接口,同时保持二进制兼容性。

语法是这样的

public interface SomeInterface() {
  void existingInterface();
  void newInterface() default SomeClass.defaultImplementation;
}

这样,对于所有现有的实现,当他们升级到这个新版本时,他们不会突然出现编译错误。SomeInterfacenewInterface()

虽然这很整洁,但是当您实现两个接口时会发生什么,这两个接口都添加了一个您未实现的新默认方法?让我用一个例子来解释。

public interface Attendance {
   boolean present() default DefaultAttendance.present;
}

public interface Timeline {
   boolean present() default DefaultTimeline.present;
}

public class TimeTravelingStudent implements Attendance, Timeline {

}

// which code gets called?
new TimeTravelingStudent().present();

这是否被定义为JDK 8的一部分?

我发现Java众神在这里谈论类似的东西 http://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.html,但它是私人邮件列表的一部分,我不能直接问他们。

有关如何在 JDK 8 中使用默认值以及扩展集合接口以支持 lambda 的更多详细信息,请参阅此处:https://oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf


答案 1

重复操作的答案是:

为了解决多重继承问题,实现两个接口的类必须提供相同方法名称和签名的默认实现。[全文]

我对你的问题的回答是:是的,这是一种多重继承的形式,因为你可以从不同的父母那里继承行为。缺少的是继承状态,即属性。


答案 2

我知道这是一个旧帖子,但是由于我正在处理这些东西......

编译器会给您一个错误,告诉您:

类 TimeTravelingStudent 从类型继承了 present() 的不相关的默认值 Attendance 和 Timeline 对 present 的引用是模棱两可的,在 Timeline 中都有 method present() 和在 Attendance match 中 method present()。