在JDK中默认是Java中的多重inheritance吗?

JDK 8中提供的新function允许您添加到现有界面,同时保持二进制兼容性。

语法就像

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

这种方式对于所有现有的SomeInterface实现,当他们升级到这个新版本时,他们并不都突然在newInterface()周围编译错误。

虽然这很整齐,但是当你实现两个接口时,会发生什么事情,这两个接口都添加了一个你没有实现的新的默认方法? 让我以一个例子来解释。

 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中使用默认设置以及如何扩展Collection接口以支持lambdas的详细信息,请参阅以下内容: https : //oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf

要观看的video会话在这里http://medianetwork.oracle.com/video/player/1113272518001这是devise师谈论虚拟扩展function。; 他还谈到如何不破坏向后兼容性。

重复操作的答案是:

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

我对你的问题的回答是:是的,这是一种多重inheritance的forms,因为你可以inheritance不同父母的行为。 缺less的是inheritance状态,即属性。

我知道这是一个旧的职位,但正在与这东西工作…

你会从编译器中得到一个错误,告诉你:

类TimeTravelingStudentinheritance了present()types的无关的默认值,typesAttendance和Timeline对present的引用是不明确的,两个方法present()在timeline和present present()在考勤中匹配。

我对你的问题的回答是:是的,这是一种多重inheritance的forms,因为你可以inheritance不同父母的行为。 缺less的是inheritance状态,即属性。

是的,但是您可以将getter和setter添加到您的界面,然后实现类必须实现。 不过,实现类不会inheritance属性。 所以,AFAICS更像是一种特质风格的解决scheme,而不是多重inheritance风格的解决scheme。

如果任何人仍然在寻找答案,如果一个类使用相同的默认方法实现两个接口,那么该类需要通过提供它自己的实现来解决消歧。 查看本教程以获取有关默认方法中的inheritance如何工作的更多详细信息。

总之:这是一个编译时错误,必须通过手工执行的方法。


默认方法的目的

在Java 8中引入默认方法的主要目的是使接口可扩展,而不会破坏现有的实现(有如此多的第三方Java库)。

像C ++中的multiple inheritance实际上是为了避免,这绝对不是Java中默认方法的目的。


如何重写

2个选项:

  • 用自己的逻辑覆盖该方法。
  • 覆盖该方法,通过super调用其中一个接口方法,format: <interface_name>.super.<method_name>();

提示:

  • 方法从接口默认为公共,所以不要忘记添加public关键字时,重写它。

两种情况:

1)首先提到的是, 没有最具体的界面

 public interface A { default void doStuff(){ /* implementation */ } } public interface B { default void doStuff() { /* implementation */ } } public class C implements A, B { // option 1: own implementation // OR // option 2: use new syntax to call specific interface or face compilation error void doStuff(){ B.super.doStuff(); } } 

2)其次,当有一个更具体的接口:

  public interface A { default void doStuff() { /* implementation */ } } public interface B extends A { default void doStuff() { /* implementation */ } } public class C implements A, B { // will use method from B, as it is "closer" to C } 

据我所知,它不是多重inheritance,因为它们是无状态的。 所以虚拟扩展方法不支持完整的对象或类function。