12

以下の例を考えてみましょう。

public class Testing extends SupCls implements Intf {
    public static void main(String[] args) {
        new Testing().test();
    }
}

class SupCls {
    public void test() {
        System.out.println("From SupCls");
    }
}

interface Intf {
    public default void test() {
        System.out.println("From Intf");
    }
}

ご覧のとおり、SupClsクラスとIntfインターフェイスの間に接続はありません。しかし、どちらも共通のメソッドを定義しています。

そしてTestingクラスは拡張SupClsして実装してIntfいます。

したがって、出力でtest()メソッドを呼び出すと、Testing

From SupCls

クラスからの拡張は、インターフェイスからの実装よりも優先される必要があるため、これは理にかなっていると思います。

しかし、以下のスクリーン キャプチャに示すように、Eclipse はそうではないと報告します。

Eclipse のスクリーン キャプチャ

これはEclipseのバグであると強く信じています。

しかし、仮定する前に、この動作はJLSで定義および文書化されていますか? または、この動作を定義する何か他のものがありますか?

編集: Eclipse のバージョンはMars Release (4.5.0)です。

4

3 に答える 3

11

defaultあなたの仮定は正しいです。スーパークラスから継承された具象メソッドは、からのメソッドよりも優先されますinterface

JLS§8.4.8。継承、オーバーライド、非表示

クラスは、その直接スーパークラスおよび直接スーパーインターフェースから、次のすべてが真であるすべてのメソッドおよびデフォルト (§9.4) メソッドをC 継承します。abstractm

…</p>

  • で宣言されたメソッドにCは、 の署名のサブ署名 (§8.4.2) である署名はありませんm
  • 直接のスーパークラスからによって継承された具象メソッドCには、 のシグネチャのサブシグネチャであるシグネチャはありませんm

引用された 2 番目の箇条書きがここに適用されます。適切なシグネチャを持つ直接のスーパークラスから継承された具象メソッドがあるため、defaultメソッドは継承されません。

ドキュメントは、追加のコメントで疑問を解消します。

継承された具象メソッドが、抽象メソッドまたはデフォルト メソッドの継承を妨げる可能性があることに注意してください。(後で、具象メソッドが「C からの」抽象メソッドまたはデフォルト メソッドをオーバーライドすることを主張します。)

したがって、 class に関してはSupCls.test()オーバーライドのようなものです。Intf.test()Testing

つまり、あなたの言うとおり、これは Eclipse のバグですが、提案のレンダリング方法にのみ影響する限り、マイナーなバグと考えます。Dがプロポーザルでレンダリングされているかどうかに関係なく、挿入されるソースは同じです。

于 2015-09-09T11:12:46.543 に答える
2

日食のバージョンが重要なようです!

Eclipse Luna (4.4.1) では、参照はSupCls代わりにIntf

ここに画像の説明を入力

おそらくEclipse Marsのバグ

于 2015-09-09T07:31:55.413 に答える