Java匿名内部类字段引用报错原因与解决方法咨询
问题分析与解决方案
为啥会报「cannot find symbol」错误?
咱们先把根儿理清楚:你的变量a声明的类型是Object,Java编译器在检查代码的时候,只认变量声明时的静态类型——而Object类里压根儿没有b这个成员,所以编译直接就给你报错了。
虽然运行起来的时候,a实际指向的是你写的第一个匿名Object子类实例(这个实例确实有b),但编译阶段不管你运行时是什么对象,只看你声明的类型,这就是问题所在。
怎么正确拿到字符串c?
方法1:两次强制转换(临时凑合用,真心不推荐)
因为匿名类没有正经的类名,你只能一层一层强制转换来碰运气,代码是这样的:
Object a = new Object(){ Object b = new Object(){ String c = "Hi!"; }; }; // 先把a转成第一个匿名子类(用Object占位),再转b的类型,最后取c System.out.println( ((Object)((Object)a).b).c );
但这种写法可读性拉胯,维护起来要命,绝对不适合实际开发。
方法2:用具名类搭建层级(完美适配你的控件管理需求)
既然你想搞ui.menu.file.open这种层级式的控件句柄管理,匿名类完全是走错路了——匿名类没法被外部代码以类型的形式引用,自然没法优雅地做层级访问。
推荐用静态内部类来构建清晰的层级结构,代码示例:
// 按你的需求搭建层级类 class UI { static class Menu { static class File { // 这里放你的控件句柄 String open = "打开文件控件实例"; } } } public class Main { public static void main(String[] args) { // 完全符合你想要的层级访问方式 System.out.println(UI.Menu.File.open); } }
如果每个层级需要是实例(比如每个UI对象有自己独立的Menu),改成非静态内部类就行:
class UI { class Menu { class File { String open = "当前UI专属的打开文件控件"; } // 实例化内部类,供上层访问 File file = new File(); } Menu menu = new Menu(); } public class Main { public static void main(String[] args) { UI ui = new UI(); // 实例化后层级访问 System.out.println(ui.menu.file.open); } }
这种写法不仅满足了你层级访问的需求,代码清晰易懂,后续维护也方便得多。
内容的提问来源于stack exchange,提问作者JavaNovice
相关产品推荐
相关产品推荐

