4

Eclipseと私のJDKが合法的なJavaと見なすものの間に興味深い矛盾が発生しています。

Eclipseは問題なく次のクラスをコンパイルしますが、MacOSXのJDKは以下に示すエラーを生成します。

public class Builder {  
    private class Item {}

    public void addItem(Item i) {}

    public static void main(String[] args) {
        new Builder() {{
            addItem(new Item());
        }};
    }
}

 

$ javac Builder.java 
Builder.java:9: non-static variable this cannot be referenced from a static context
            addItem(new Item());
                    ^
1 error

クラスを静的にすると問題は解決しますが、少し不思議に思います。EclipseItemは寛大で、実際には有効ではないコードをコンパイルしていますか?Mac OS X JDKの奇抜さに出くわしましたか?私は何かが足りないのですか?

更新 は、以下を含めるために関連する可能性があります

$ java -version
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)

アップデート2

アイテムをより見やすくする(デフォルト、保護、またはパブリック)ことも、JDKコンパイラーを満たします。

4

5 に答える 5

4

javac 1.7.0_04はエラーなしでソースをコンパイルするので、これはjavac1.6のバグであることをお勧めします。

于 2012-08-06T19:24:42.300 に答える
2

同じ結果が得られますが、興味深いことに、コードを次のように変更します。

new Builder() {{
    addItem(this.new Item());
}};

(同一である必要があります)は、異なるエラーメッセージを生成します。

Builder.java:9: Builder.Item has private access in Builder
            addItem(this.new Item());

これが本当の根本的なエラーだと思います-Itemクラスはプライベートなので、匿名サブクラスには表示されません。Itemプライベートではなく保護に変更すると、元のバージョンとバージョンの両方がthis.new正常にコンパイルされます。

于 2012-08-06T19:25:31.227 に答える
1

Eclipseでは、デフォルトで、デフォルトAccess to a non-accessible member of an enclosing typeで無視される場合があります。「プロジェクト」->「プロパティー」->「Javaコンパイラー」->「エラー/警告」に移動すると、プロジェクト固有の設定を有効にできます。

不一致はおそらく、Eclipseに独自のコンパイラー(JDTの一部)が付属しているためです。これは、とは少し異なる動作をしますjavac

于 2012-08-06T19:20:08.740 に答える
0

Eclipseコンパイラのバグだと思います。内部Itemクラスは静的ではないため、次のようにBuilderオブジェクトを介してのみアクセスできます。

new Builder().new Item()

静的ブロックでItemクラスを初期化すると、Builderのインスタンスがないため、投稿したこのコードは機能しないはずです。非常に興味深いエラー。

于 2012-08-06T19:13:34.323 に答える
-2

アイテムのクラス宣言に静的を追加します。static class Item {}

于 2012-08-06T19:09:28.840 に答える