Java 17模式匹配子类型疑问:Eclipse中代码为何可编译?
Java 17模式匹配编译困惑解答
我使用Java 17时遇到了一个疑惑:按照Java语言规范的预期,下面代码的最后一行应该无法编译,但在Eclipse中却成功通过了。想搞清楚:模式匹配中,目标值的类型必须是模式类型的子类型,还是可以是任意类型?
代码示例:
Double value = 123.3; if(value instanceof Double ) {} if(value instanceof Double data) {} // 预期不编译,但Eclipse中成功编译
核心解释
- 从Java语言规范的角度,当
instanceof的目标表达式静态类型已经是模式类型的子类型或相等类型时,声明式模式(即带变量的instanceof Type var写法)是不被允许的。因为此时类型检查完全冗余——编译器已经确定value必然是Double类型,没必要再通过模式匹配声明新变量,标准JDK编译器(javac)会直接报错。 - Eclipse能编译通过是因为它使用的ECJ编译器和javac在这一规则的执行上存在差异,ECJ放宽了对这种冗余模式匹配的检查,但这并不符合Java官方的语言规范。
- 结论:模式匹配的声明式写法,仅适用于目标静态类型可能是模式类型的父类型或无关类型的场景,当目标类型已经确定是模式类型(或其子类型)时,这种写法既无意义也不符合规范,应该直接使用原变量即可。
内容的提问来源于stack exchange,提问作者DEV
相关产品推荐
相关产品推荐

