15

众所周知,interfacesJava 可以实现多个。它们的实施顺序重要吗?我的意思是,实施 B, C 是否与 C, B in 相同Java 8?我的测试显示顺序确实很重要 - 但任何人都可以解释这背后的逻辑吗?

public interface A {
    public default void display() {
        System.out.println("Display from A");
    }
}

public interface B extends A {
    public default void display() {
        System.out.println("Display from B");
    }
}

public interface C extends A {
    public void display();
}

public interface D extends B, C {

}

上面的代码工作正常。如果我将顺序更改B, CC, B,则会出现错误:The default method display() inherited from B conflicts with another method inherited from C.

public interface D extends C, B {

}

编辑

我正在使用 Eclipse(火星)。JDK jdk1.8.0_51. 杰瑞jre1.8.0_60

4

2 回答 2

8

无论哪种方式,都应该有错误消息。当我使用 jdk 1.8.0_31 时,无论接口的顺序如何,都会出现以下错误:

继承自 AB 的默认方法 display() 与继承自 AC 的另一个方法冲突

解决方案是覆盖display()甚至D只是告诉编译器要使用哪个超类的实现:

public interface D extends B, C {
    default void display(){
        B.super.display();
    }
}

或者重新制作display()摘要

interface D extends B, C {
    public void display();
}

如果您确实使用比我更高的版本收到此错误,那么是否值得提交错误报告?

于 2015-09-19T03:38:44.960 回答
6

javac的结果(所有版本 1.8.0_x):

error: interface D inherits abstract and default for display() from types B and C

来自ecj 4.4 的结果:

The default method display() inherited from B conflicts with another method inherited from C

来自ecj >= 4.4.1 的结果:

NO ERROR

ecj >= 4.4.1 如果D更改了 extends 子句中的顺序,仍然会正确报告错误。

我得出的结论是,这是 Eclipse 中的一个错误,它在 4.4.1 中引入。我已提交错误 477891以跟进。

编辑: 错误 477891已在里程碑 3 中针对 Eclipse 4.6(GA:2016 年 6 月)修复。

于 2015-09-20T12:33:38.993 回答