我使用的示例来自 Java,Herbert Schildt 的完整参考文献,第 12 版,Java 是 14
他给出了以下 2 个示例(如果阻止),第一个是好的,第二个是错误的,因此发表评论
public class PatternMatch {
public static void main(String[] args){
Number myOb = Integer.valueOf(9);
int count = 10;
if((count < 100) && myOb instanceof Integer iObj) { // is OK!!!
iObj = count;
}
/*
if((count < 100) & myOb instanceof Integer iObj) { // Error!!!
iObj = count;
}
*/
}
}
他对为什么第二个 if 块(注释掉)的解释是“在这种情况下,编译器无法知道 iObj 是否在 if 块的范围内,因为 & 的右侧不一定会被评估”。这导致了我的困惑: & 确保它的左侧和右侧总是被评估,那么为什么“因为 & 的右侧不一定会被评估”?
Thanks!
如果你将 java14 代码放入你的 IDE 中,你确实会看到第二个 if 块产生编译错误,说 iObj 未定义...但我只是不明白他的解释:
他对为什么第二个 if 块的解释是“在这种情况下,编译器无法知道 iObj 是否在 if 块的范围内,因为 & 的右侧不一定会被评估”。这导致了我的困惑: & 确保它的左侧和右侧总是被评估,那么为什么“因为 & 的右侧不一定会被评估”?
public class PatternMatch {
public static void main(String[] args){
Number myOb = Integer.valueOf(9);
int count = 10;
if((count < 100) && myOb instanceof Integer iObj) { // is OK!!!
iObj = count;
}
if((count < 100) & myOb instanceof Integer iObj) { // Error!!!
iObj = count;
}
}
}
事实上,“右侧不一定会被评估”是完全错误的。
&&
是合法的,因为在 if 语句中,你有绝对的保证myObj instanceof Integer iObj
将被评估,and评估为真(从而建立iObj
在 if 块内的代码范围内)。给定a && b
, b 不一定被评估,但如果代码流入该if
, b 肯定是,这就是你的第一个代码片段编译的原因。
&
在这里可能不合法,因为规范没有打扰。没有任何解释涉及以下场景:myObj instanceof Integer iObj
要么没有得到评估,要么评估为false
不知何故。在 if 块内,它将被评估,并且将被评估为true
。但是,关键是,编译器必须根据静态代码分析和那部分规范没有明确列出这一点boolean & boolean
建立明确的评估(并且绝对真实的评估)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)