instanceof Java中的模式匹配,未编译

问题描述 投票:0回答:1

下面是摘自《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;
}

现在可以了。

我想知道为什么会发生这种情况。

java object compiler-errors pattern-matching instanceof
1个回答
0
投票

首先,问题中的引用是垃圾!

&&
是“捷径”形式,不保证双方都会被执行;在这种情况下,如果第一项的计算结果为
false
,则第二项将永远不会被触及。
&
保证这两个术语都被评估。

尽管如此,由于某种原因,模式匹配可能不适用于单个

&
(但不适用于引用中给出的那个!!)

instanceof
的模式匹配在 Java 14 中作为预览引入,第二次预览在 Java 15 中开始,直到在 Java 16 中最终确定。而 JEP 实际上只讨论了
&&
||
,而不是关于
&
|
。但让这种行为与快捷方式不同并没有多大意义。

© www.soinside.com 2019 - 2024. All rights reserved.