在 if 语句中使用 instanceof 作为模式匹配运算符时,如果使用布尔逻辑运算符 &,则代码无法编译,但如果使用 &&,则会成功。
这确实可以编译:
Number n = Integer.valueOf(9);
if (n instanceof Integer i) {
i = 3;
}
这不能编译:
Number n = Integer.valueOf(9);
if (n instanceof Integer i & true) {
i = 3;
}
// Hello.java:6: error: cannot find symbol
// i = 3;
// ^
// symbol: variable i
// location: class Hello
// 1 error
这确实可以编译:
Number n = Integer.valueOf(9);
if (n instanceof Integer i && true) {
i = 3;
}
任何人都可以解释为什么第二个代码片段无法编译吗?
我认为这可能是因为 JLS 的第 6.3.1 节,其中提到了
只有某些类型的布尔表达式参与引入模式变量并确定这些变量在哪里明确匹配。如果表达式不是条件与表达式、条件或表达式、逻辑补表达式、条件表达式、instanceof 表达式、switch 表达式或括号表达式,则不适用范围规则。
由于未列出布尔逻辑运算符
&
,因此表达式 n instanceof Integer i & true
不会引入随后可在 if
语句主体中看到的模式变量。