Java 访问外部匿名类';来自内部匿名类的s字段
要从内部类B访问外部类A的字段x,我意识到可以使用“A.this.x”。但是如果外部类也是匿名的呢?比如说,Java 访问外部匿名类';来自内部匿名类的s字段,java,anonymous-inner-class,Java,Anonymous Inner 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) { Com
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));
}
}
与
但是由于外部类也是匿名的,所以我没有名称可供使用
问题:有没有办法修改标记为“THIS line”的行,使其引用c1的字段x而不是c2,而不将匿名类更改为命名类
我意识到这段代码真的很难看,用这种方式使用匿名类不是好的编程风格,但代码是由另一个程序生成的,这是实现生成器的最简单方法。我可以通过选择x以外的名称来避免隐藏其他变量。我相信您必须将字段声明为final——您在那里编译的代码只是因为您抱怨的阴影。不是真的
这看起来像是一个经典案例,类似Lisp的东西会让事情变得更简单。换句话说,让代码生成器为这些变量使用不同的标识符,例如x1和x2。简单的答案是不要对变量进行阴影处理:
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));
}
输出:
三,
考虑到您正在使用生成的代码,这是您的一个选项吗?AFAIK没有办法实现您想要的。如果您可以更改代码(看起来可以),但不想将它们更改为命名类,那么您可以只更改变量的名称而不存在范围问题吗?无论如何,为了清晰起见,您应该重命名它们类是匿名的——匿名的。无法使用名称引用访问其字段。没有名称。字段不需要是最终字段;这仅适用于参数/局部变量。如果他调用外部字段“y”,他可以从最内部的类访问它。
return A.this.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));
}