引用内部类的字段

时间:2018-04-11 20:08:47

标签: java anonymous-class

我是java新手并试图了解匿名内部类的工作原理。

Object a = new Object(){
    Object b = new Object(){
        String c = "Hi!";
    };
};

System.out.println( a.b.c );

当我尝试运行上面的代码时,我找不到符号'错误。有人可以解释一下为什么我会收到此错误,如何引用String c。

我正在尝试的原因'一个可能很奇怪的事情是我想以分层方式组织窗口小部件句柄,例如' ui.menu.file.open'

2 个答案:

答案 0 :(得分:2)

虽然变量a动态类型是包含字段c的匿名类型,但其静态类型为Object ,没有字段c

一旦Java引入var声明,您就能够解决此问题,这些声明会隐式派生类型。不幸的是,this wouldn't be available until Java 10

// ** WARNING ** This would not compile until Java 10
var a = new Object() {
    String c = "Hi!";
};
System.out.println( a.c );

在此之前,您必须为匿名对象声明一个公共类型,并让它公开您需要的属性:

interface HasMyProperty {
    String getC();
}
interface HasMyObject {
    HasMyProperty getB();
}
...
HasMyObject a = new HasMyObject() {
    HasMyProperty b = new HasMyProperty() {
        private final String c = "Hi!";
        @Override
        public string getC() { return c; }
    };
    @Override
    public HasMyProperty getB() { return b; }
};
System.out.println( a.getB().getC() );

答案 1 :(得分:0)

此处bc是匿名类的字段,但您不能在匿名类之外引用它们,因为类的类型为ObjectObject班级没有这些领域 虽然在匿名类本身中引用这些字段是合法的,例如:

Object a = new Object(){

    Object b = new Object(){

        String c = "Hi!";
        @Override
        public String toString(){
            return c;
        }
    };
};

要解决您的要求(访问自定义字段),您不应使用匿名类,而应使用自己的类来呈现预期的结构,例如:

public class A{
   public B b = new B();
}
public class B{
   public String c = "Hi";
}

所以你可以写(虽然不建议使用公共实例字段):

String c = new A().b.c;