簡體   English   中英

從內部匿名類訪問外部匿名類的字段

[英]Accessing an outer anonymous class's field from an inner anonymous class

要從內部類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));
    }
}

運行此代碼時,將打印值4,因為這是c2的字段x的值。 但是,我想更改標記為“THIS LINE”的行,以便返回外部類的x(即c1的字段x,值為3)。 如果外部類(即c1的類)是一個命名的類A,那么我可以替換

return x;

return A.this.x;

但由於外層也是匿名的,我沒有名字可以使用。

問題:有沒有辦法修改標記為“THIS LINE”的行,使其引用c1的字段x而不是c2,而不將匿名類更改為命名類?

我意識到這段代碼非常難看,以這種方式使用匿名類是不好的編程風格,但代碼是由另一個程序生成的,這是實現生成器的最簡單方法。

我會通過選擇x以外的名稱來避免隱藏其他變量。

簡單的答案是不要遮蔽變量:

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

鑒於您正在使用生成的代碼,這是一個選項嗎?

AFAIK沒有辦法實現你想要的。 如果您可以更改代碼(因為您似乎能夠)但不想將它們更改為命名類,您是否可以更改變量的名稱,以便不會出現范圍問題? 無論如何,您應該重新命名它們

類是匿名的 - 無名的。 無法使用名稱引用訪問其字段。 沒有名字。

我相信你必須聲明最終的字段 - 你在那里編寫的代碼只是因為你抱怨的陰影而編譯 不對。

這看起來像一個典型的案例,像Lisp的gensym之類的東西會讓事情變得更容易。 換句話說,讓代碼生成器為這些變量使用不同的標識符 - 例如x1和x2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM