Java中直接枚举类型与Enum<>泛型类型的具体技术差异是什么
核心差异为两个变量的静态类型不同,这是switch编译结果不同的根本原因:
letter1的静态类型是具体自定义枚举类Letter,符合Java switch语句对枚举类型的语法要求letter2的静态类型是泛型抽象父类Enum<Letter>,不满足switch的枚举参数规则
1. 静态类型与运行时类型的区别
所有Java自定义枚举类都隐式继承自java.lang.Enum抽象类,因此Letter的实例可以向上转型赋值给Enum<Letter>类型的变量:
- 运行时两个变量指向的实例实际类型都是
Letter,调用getClass()、name()、ordinal()这些Enum类定义的实例方法时,会触发动态分派,执行的都是Letter类的对应逻辑,因此返回结果完全一致。 - 编译期编译器只会识别变量的静态类型,不会预判运行时的实际类型。
2. switch对枚举参数的硬性限制
Java语言规范明确规定:如果switch括号内的表达式是枚举类型,必须是具体的自定义枚举类类型,对应的case标签必须是该枚举类中定义的枚举常量。
对于letter2来说,它的静态类型是Enum<Letter>,这是所有枚举的公共父类,本身没有定义Alpha、Beta这类业务枚举常量,编译器无法确认当前变量对应的枚举取值范围,也无法校验case标签的合法性,因此直接编译报错。
如果需要让letter2支持switch,只需要先向下转型为具体枚举类即可:
switch((Letter) letter2) { case Alpha: case Beta: }
内容的提问来源于stack exchange,提问作者Stewart
相关产品推荐
相关产品推荐

