JDK 8中的默认值是Java中的多重继承形式吗?

Pyr*_*cal 80 java closures interface multiple-inheritance java-8

JDK 8中的新功能允许您在保留二进制兼容性的同时添加到现有接口.

语法就像

public interface SomeInterface() {
  void existingInterface();
  void newInterface() default SomeClass.defaultImplementation;
}
Run Code Online (Sandbox Code Playgroud)

这种方式对于所有现有的实现,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();
Run Code Online (Sandbox Code Playgroud)

这被定义为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

H-M*_*an2 66

重复操作的答案是:

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

我对你的问题的回答是:是的,它是一种多重继承的形式,因为你可以继承来自不同父母的行为.缺少的是继承状态,即属性.

  • +1:当存在冲突时,它将采用更具体的实现而不是特定的实现,允许您指定在存在冲突时应该是哪一个. (2认同)

Pet*_*rey 9

要观看的视频会议在这里http://medianetwork.oracle.com/video/player/1113272518001这是设计师谈论称为虚拟扩展的功能.他还谈到了这不会破坏向后兼容性.

  • 所以我的例子的答案目前是你得到编译器错误.但他们对其他解决方案持开放态度. (11认同)
  • @ajay我忘记了,但现在Java 8已经出局了.您可以运行该代码并亲自了解实际发生的情况. (2认同)

Enk*_*nkk 8

我知道这是一个老帖子,但是因为我正在使用这些东西......

您将收到编译器的错误,告诉您:

类TimeTravelingStudent从类型继承present()的无关默认值出席和时间轴对当前的引用是不明确的,时间轴中的方法present()和出勤匹配中的方法present().


And*_*ejs 6

两种情况:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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
    }
Run Code Online (Sandbox Code Playgroud)


Eri*_*ang 5

简而言之:这是一个编译时错误,必须在实现中手动覆盖该方法。


默认方法的目的

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

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


如何覆盖

2个选项:

  • 用它自己的逻辑覆盖该方法。
  • 覆盖该方法,通过super, 格式调用接口的方法之一:<interface_name>.super.<method_name>();

提示:

  • 接口中的方法默认为public,所以public在覆盖它时不要忘记添加关键字。