如何解决当枚举类型包含至少一个“扩展”枚举时,为什么将枚举转换为任何接口都不会在Java中引起编译错误?
以下代码编译:
public enum Foo {
A,B{};
public static void main(String[] args) {
Foo f = Foo.A;
List s = (List)f;
}
}
这不是:
public enum Foo {
A,B;
public static void main(String[] args) {
Foo f = Foo.A;
List s = (List)f;
}
}
我也可以将Foo.A
替换为Foo.B
,并获得相同的结果。
这里发生了什么?在第一个示例中,Foo.A
怎么可能成为List
?
解决方法
对于这种类型的转换,spec on Narrowing Reference Conversion定义了规则。枚举没有特殊情况,只有最终类和非最终类有所区别。
基本枚举属于“最终类”类别,但您的扩展枚举不属于该类别,因为它通过{}
语法引入了一个子类。
当然,即使使用扩展的枚举,也无法使您的枚举常量之一实现List
,但当前的规范根本无法解决这种情况。
该规范的未来修订版可能会对此有所改善,然后我希望编译器会执行其他检查。但是目前,这种程度的编译时安全性尚不可用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。