Pattern Matching for instanceof:子类型匹配父类型未触发编译错误的疑问
关于JEP 394中
instanceof编译错误规则的澄清 你提到的JEP 394里的编译时错误规则,仅适用于带模式变量绑定的instanceof模式匹配语法,而非传统的instanceof类型检查表达式。
- 传统的
instanceof语法(如你的代码n instanceof Number)只是做类型兼容性检查,即使表达式的静态类型是目标类型的子类型,编译器也不会报错——因为这种写法在某些场景下仍有意义(比如处理可能的null值:如果n是null,n instanceof Number会返回false)。 - 而JEP 394新增的模式匹配式
instanceof(即带变量绑定的写法,比如n instanceof Number num)才会触发编译错误:当表达式的静态类型是目标类型的子类型时,这个模式匹配必然成功,绑定变量的操作毫无意义,编译器会直接报错。
举个例子,以下代码才会触发JEP 394中描述的编译错误:
Integer n = 1; if (n instanceof Number num) { // 编译错误:Integer是Number的子类型,该模式始终匹配 System.out.println("hi"); }
而你提供的代码使用的是传统instanceof语法,不属于JEP 394规则的约束范围,因此可以正常编译运行。
内容的提问来源于stack exchange,提问作者energize-cactus
相关产品推荐
相关产品推荐

