我使用的例子来自Java,完整的参考资料由赫伯特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块的作用域中,因为&的右边不一定会被求值”。这导致了我的困惑:&确保它的左侧和右侧总是被求值,那么为什么“因为&的右侧不一定被求值”呢?
谢谢!
如果你把java 14代码放到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;
}
}
}
1条答案
按热度按时间kmbjn2e31#
事实上,“正确的一面不一定会被评价”是完全错误的。
&&
是法律的的,因为在if语句中,您可以绝对保证myObj instanceof Integer iObj
已被求值,* 并且 * 求值为true(这样就在if块内的代码作用域中建立了iObj
)给定a && b
,b不一定要求值,但是如果代码流入if
,b肯定已经求值了,这就是为什么你的第一个代码片段会被编译。&
在这里可能是不法律的的,因为规范并不麻烦。没有解释涉及myObj instanceof Integer iObj
要么没有被求值,要么以某种方式被求值为false
的情况。在if块中,它 * 将被求值,并且将被求值为true
*。但是,关键是,编译器必须根据静态代码分析来确定,并且 * 该部分 * 是规范不必显式列出boolean & boolean
建立明确求值(以及明确的真求值)的地方。