为什么Java枚举构造方法中返回this和Enum.this的结果存在差异?
问题原因
你遇到的报错和枚举实例初始化进程无关,核心是Java匿名内部类的this指向规则导致的类型不匹配错误:
- 在你实现
EnumGetter接口的匿名内部类中,直接写this指向的是当前匿名内部类本身的实例,而非外层的TestEnum枚举实例。你把这个EnumGetter实现类对象存入缓存后,后续读取时强转为TestEnum类型就会抛出ClassCastException,这才是报错的根因。 - 你使用
TestEnum.this(你提到的Enum.this为对应外层枚举类的简写指代)的写法,是Java内部类访问外部类实例的固定语法,此时返回的才是目标枚举实例,因此运行正常。
修复方案
只需要修改匿名内部类中get()方法的返回值即可:
EnumManager.register(TestEnum.class, new EnumGetter() { public Object get() { // 明确返回外层枚举实例,不要用默认指向内部类的this return TestEnum.this; } // 其余方法保持不变 public Object getK1() { return code; } public Object getK2() { return null; } public Object getK3() { return null; } });
补充说明
枚举构造器执行阶段,枚举实例确实还未完成全部初始化流程,但你的报错场景和该特性无关,从异常栈中的类型转换错误提示可以直接验证这一点。
内容的提问来源于stack exchange,提问作者yh guo
相关产品推荐
相关产品推荐

