2009-02-11 119 views
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)); 
    } 
} 

当运行该代码,被印刷的4值,因为这是C2的字段x的值。但是,我想更改标记为“THIS LINE”的行,以便它返回外部类的x(即c1的字段x,值为3)。如果外部类(即C1的类)是一个名为A级,那么我可以代替

return x; 

return A.this.x; 

但由于外部类也是匿名的,我没有一个使用的名字。

问:是否有修改标注“本线”行,以便它指的是C1的域x,而不是C2的,在不改变匿名类到名为类的方法吗?

我意识到这段代码真的很丑,并且这种方式使用匿名类的编程风格不是很好,但代码是由另一个程序生成的,而这是实现生成器的最简单方法。

回答

4

我会避免通过选择X以外的名称隐藏另一个变量。

0

我相信你将不得不宣布字段最后 - 你在那里的代码编译只是因为你抱怨的阴影 。不对。

这看起来像一个典型的情况下像Lisp的gensym会使事情变得更容易。换句话说,让代码生成器为这些变量使用不同的标识符 - 例如x1和x2。

+0

该字段不需要是最终的;这只适用于参数/局部变量。如果他称外场为'y',他可以从最内层的阶层进入。 – 2009-02-11 15:07:51

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)); 
} 

输出:

既然你与生成的代码的工作,这是一个选项您?

1

AFAIK有没有办法达到你想要的东西。如果您可以更改代码(因为您似乎可以)但不想将其更改为命名类,那么您是否可以更改变量的名称,以避免出现范围问题?你无论如何都应该将其重命名为清楚起见

1

类是匿名的 - 无名。没有办法使用名称引用访问他们的字段。没有名字。