java - 引用内部类的字段

标签 java anonymous-class

<分区>

我是 Java 的新手,正在尝试了解匿名内部类的工作原理。

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

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

当我尝试运行上面的代码时,出现“找不到符号”错误。有人可以解释一下为什么会出现此错误以及如何引用字符串 c。

(我尝试“可能很奇怪”的事情的原因是我想以分层方式组织小部件句柄,例如“ui.menu.file.open”。)

最佳答案

虽然 dynamic 类型的变量 a 是具有字段 c 的匿名类型,但它的 static 类型是 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() );

关于java - 引用内部类的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49783685/

相关文章:

java - 运行配置以在 IntelliJ IDEA 中调试 Bukkit/Minecraft 插件?

Java xml 解析?

java - 使用 retrofit2 时如何修复 "failed to connect"错误?

java - SwingWorker,取消按钮不起作用

Java:可序列化的内部类和匿名类是否应该有 SerialVersionUID?

java - 是否可以从匿名类调用多个方法?

java - Java "caching"是匿名类吗?

java - 如何增加Android Studio分配的内存?

java - 从匿名内部类调用重写的默认方法

java - Java中匿名类的方法