Java 访问外部匿名类';来自内部匿名类的s字段

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

要从内部类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));
    }
}

但是由于外部类也是匿名的,所以我没有名称可供使用

问题:有没有办法修改标记为“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));
}