为何使用&运算符时instanceof模式匹配编译失败?
为什么使用
&时instanceof模式匹配变量无法编译? 核心原因是Java中&(非短路逻辑与/按位与)不支持短路求值,而&&(短路逻辑与)支持,结合instanceof模式匹配的变量作用域规则,导致了编译差异。
关键规则回顾
Java 16引入的instanceof模式匹配中,通过n instanceof Integer i声明的变量i,其作用域仅限条件确定为true的代码分支。只有当编译器能静态判定该匹配条件必然成立时,i才能在后续代码中被合法访问。
代码示例分析
可编译:直接匹配
Number n = Integer.valueOf(9); if (n instanceof Integer i) { i = 3; }
编译器明确知道:进入if块的前提是n instanceof Integer为true,因此i已被成功绑定,作用域覆盖整个if块,编译正常。
不可编译:使用&
Number n = Integer.valueOf(9); if (n instanceof Integer i & true) { i = 3; } // 编译错误:cannot find symbol variable i
&是非短路运算符,它会强制计算左右两边的表达式,无论左边结果如何。编译器无法静态保证n instanceof Integer i一定为true(哪怕右边是true,&的特性让编译器必须考虑左边为false的情况),因此i的作用域无法延伸到if块中,导致访问i时提示找不到符号。
可编译:使用&&
Number n = Integer.valueOf(9); if (n instanceof Integer i && true) { i = 3; }
&&是短路运算符:只有左边表达式n instanceof Integer i为true时,才会计算右边的true。编译器能确定进入if块的前提是匹配成功,i已被绑定,因此作用域覆盖if块,编译正常。
内容的提问来源于stack exchange,提问作者Lilypad
相关产品推荐
相关产品推荐

