在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。