在Java 8规范中,有以下syntax description of the conditional operator ?::
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
ConditionalOrExpression ? Expression : LambdaExpression
我了解前两行。但是为什么第三行是必要的? LamdaExpression有什么特别之处,需要在此处明确声明?在下文中,我看不到有讨论。
最佳答案
我想我知道答案,但这很奇怪。
这是第十五章的引文:
运算符之间的优先级由语法层次结构管理
生产。最低优先级运算符是Lambda箭头
表达式(->),然后是赋值运算符。因此,所有
表达式在语法上包含在LambdaExpression和
AssignmentExpression非终结符:
表达式:LambdaExpression AssignmentExpression
ConditionalExpression是AssignmentExpression的一部分:
AssignmentExpression:ConditionalExpression分配
如您所引用,ConditionalExpression
的第三部分只能是ConditionalExpression
,而不能是Expression
。
将第三部分设为Expression
会包含诸如Assignment
之类的不良内容:
a? b : c=d // bad idea?
但是,将第三部分限制为
ConditionalExpression
而不是Expression
可以省去LambdaExpression
,因此现在需要使用ConditionalOrExpression?表达式:LambdaExpression
这实际上带来了下一个问题:在条件表达式的第二部分中,为什么
Assignment
可以,但是在条件表达式的第三部分中,为什么没有?