JDK17 switch使用Number、自定义类型未违反JLS规范原因问询
问题解答
1. 为什么Number类型作为switch选择器不会触发编译错误?
你看到的JLS 17中关于switch选择器类型的限制,仅适用于传统只支持常量case的switch语法。你运行代码时开启了--enable-preview参数,实际使用的是JDK 17引入的预览特性「switch模式匹配」,该特性在JDK 21正式转正,对应的规范已经扩展了switch选择器的类型范围:
- 搭配类型模式使用的switch,选择器支持任意引用类型,不需要和传统switch一样受限于char/byte/short/int/String/枚举及其包装类
- 该现象和泛型、自动装箱没有关系,
no.getClass()返回Float是运行时的实际类型,编译期只检查选择器的静态类型是否符合当前switch语法的要求,模式匹配switch允许Number这种引用类型作为选择器。
2. 为什么自定义普通类也可以作为switch选择器?
这同样是switch模式匹配的特性支持:该特性允许任意引用类型作为switch选择器,只要case分支的模式能覆盖选择器的所有可能取值(如果没有覆盖全就需要加default分支)。你给出的示例中,选择器静态类型是自定义类a,case分支先匹配子类b再匹配父类a,已经完整覆盖了所有可能的实例,所以完全符合该特性的语法规范,没有违反JLS规定——你参考的JLS条文仅对应传统switch的规则,没有包含预览特性的扩展内容。
内容的提问来源于stack exchange,提问作者lineage
相关产品推荐
相关产品推荐

