15

ご存じのようにinterfaces、Java では複数を実装できます。それらの実装の順序は重要ですか? つまり、B、C は C、B と同じ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, Cをに変更するC, 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. JRE jre1.8.0_60

4

2 に答える 2

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

Dorder inの extends 句が変更された場合でも、 ecj >= 4.4.1 はエラーを正しく報告します。

これは、4.4.1 で導入された Eclipse のバグであると結論付けています。フォローアップするためにバグ 477891を提出しました。

編集: バグ 477891は、Eclipse 4.6 に向けてマイルストーン 3 で修正されました (GA: 2016 年 6 月)。

于 2015-09-20T12:33:38.993 に答える