下面是摘自《Java - The Complete Reference》一书的一段话。
Number myOb = Integer.valueOf(9); int count = 10; if((count < 100) && myOb instanceof Integer iObj) { // is OK // myOb is both an Integer and nonnegative, and count is less than 100. iObj = count; //.. }
该片段可以编译,因为 if 块仅当 && 两边都是时才会执行
真实。因此,在 if 块中使用 iObj 是有效的。但是,如果
,将会导致编译错误您尝试使用 & 而不是 &&,如下所示:
if((count < 100) & myOb instanceof Integer iObj) { // Error!
在这种情况下,编译器无法知道 iObj 是否在 if 块的范围内
因为 & 的右侧不一定会被求值。
我完全不明白最后几行,为什么如果模式匹配失败,代码甚至会进入 if 块,如果成功并且第一个条件为 true,那么使用 '&' 而不是 '&&' 有什么问题。
如果我在 if 块内手动初始化 iObj,代码就可以工作,但为什么模式匹配不起作用?整个想法是创建一个引用变量,指向所提到类型的提取对象。
手动初始化之前我得到了什么
Compile Error: iObj may not be initialized
我尝试了什么
if((count < 100) & myOb instanceof Integer iObj) {
int iObj = (Integer) myOb;
}
现在可以了。
我想知道为什么会发生这种情况。
首先,问题中的引用是垃圾!
&&
是“捷径”形式,不保证双方都会被执行;在这种情况下,如果第一项的计算结果为 false
,则第二项将永远不会被触及。 &
保证这两个术语都被评估。
尽管如此,由于某种原因,模式匹配可能不适用于单个
&
(但不适用于引用中给出的那个!!)
instanceof
的模式匹配在 Java 14 中作为预览引入,第二次预览在 Java 15 中开始,直到在 Java 16 中最终确定。而 JEP 实际上只讨论了 &&
和 ||
,而不是关于&
和|
。但让这种行为与快捷方式不同并没有多大意义。