5

内部クラス B から外部クラス A のフィールド x にアクセスするには、「A.this.x」を使用できることに気付きました。しかし、外部クラスも匿名の場合はどうなるでしょうか? 例えば、

public class Main1 {
    public static void main(String[] args) {
        Comparable c1 = new Comparable(){
            int x = 3;
            public int compareTo(Object o) {
                Comparable c2 = new Comparable(){
                    int x = 4;
                    public int compareTo(Object o) {
                        return x;  // <-- THIS LINE
                    }
                };
                return c2.compareTo(o);
            }
        };
        System.out.println(c1.compareTo(null));
    }
}

このコードが実行されると、c2 のフィールド x の値である 4 の値が出力されます。ただし、「THIS LINE」とマークされた行を変更して、外部クラスの x (つまり、値 3 を持つ c1 のフィールド x) を返すようにしたいと考えています。外側のクラス (つまり、c1 のクラス) が名前付きクラス A である場合、次のように置き換えることができます。

return x;

return A.this.x;

しかし、外側のクラスも匿名であるため、使用する名前がありません。

質問: 匿名クラスを名前付きクラスに変更せずに、c2 ではなく c1 のフィールド x を参照するように、「THIS LINE」というラベルの付いた行を変更する方法はありますか?

このコードは本当に醜く、匿名クラスをこのように使用するのは適切なプログラミング スタイルではないことは理解していますが、コードは別のプログラムによって生成されており、これがジェネレーターを実装する最も簡単な方法です。

4

5 に答える 5

2

簡単な答えは、変数をシャドウしないことです。

public static void main(String[] args) {
    Comparable c1 = new Comparable() {
        int x = 3;
        public int compareTo(Object o) {
            Comparable c2 = new Comparable() {
                //changed this name
                int y = 4;
                public int compareTo(Object o) {
                    return x;
                }
            };
            return c2.compareTo(o);
        }
    };
    System.out.println(c1.compareTo(null));
}

出力:

3

生成されたコードを使用している場合、これはオプションですか?

于 2009-02-11T14:59:42.633 に答える
1

私の知る限り、あなたが望むものを達成する方法はありません。(できるように見えるように) コードを変更できるが、それらを名前付きクラスに変更したくない場合は、スコープの問題がないように変数の名前を変更できますか? とにかくわかりやすくするために名前を変更する必要があります

于 2009-02-11T15:00:28.623 に答える
1

クラスは匿名、つまり無名です。名前参照を使用してフィールドにアクセスする方法はありません。名前はありません。

于 2009-02-11T15:00:54.050 に答える
0

フィールドを final と宣言する必要があると思います。そこにあるコードは、あなたが不満を言っているシャドーイングのためだけにコンパイルされます。違います。

これは、Lisp のgensymのようなものが物事を容易にする典型的なケースのように見えます。つまり、コード ジェネレーターでこれらの変数に異なる識別子 (x1 と x2 など) を使用するようにします。

于 2009-02-11T14:57:13.623 に答える