[英]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.