对Java规范中definite matching的&&表达式false时规则的疑问
关于Java语言规范中**Definite Matching(确定匹配)**的疑问
我对Java语言规范中确定匹配的部分存在疑问,尤其是JLS 6.3.1.1章节里关于条件与运算符&&的规则:
- 由表达式
a在true分支引入的模式变量,在表达式b处确定匹配。 - 表达式
a && b在true分支引入模式变量,当且仅当该变量由a在true分支引入,或由b在true分支引入。
规范的注释里提到,a && b在false分支没有模式变量引入规则,原因是编译时无法确定是哪个操作数导致表达式为false。我无法理解这个原因的合理性:
比如a instanceof String s这类模式表达式,仅在结果为true时引入模式变量s,这里的"when true"或"when false"只是基于表达式取值的预设场景,和**Definite Assignment(确定赋值)**中的同名概念完全不同。
举个确定赋值的例子:
{ int k; int n = 5; if (n > 2) k = 3; System.out.println(k); /* k is not "definitely assigned" before this statement */ }
JLS 16.2.7章节中if (e) S的规则提到,变量V在if (e) S之后[未]被确定赋值,当且仅当V在S之后[未]被确定赋值,且在e为false时[未]被确定赋值。如果确定匹配中的"when false"和确定赋值里的概念相同,那么上面例子中的k应该被判定为确定赋值,但实际并非如此。
由此我认为:确定赋值除编译时常量外,不考虑表达式的实际取值;但确定匹配明显会基于表达式的取值场景来判断。因此我觉得可以为6.3.1.1补充规则:a && b在false分支引入模式变量,当且仅当该变量由a在false分支引入、由a在true分支引入,或a为true时由b引入。但规范注释的观点和我完全相反,特此寻求解答。
内容的提问来源于stack exchange,提问作者user24723440
相关产品推荐
相关产品推荐

