在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可以,但是在条件表达式的第三部分中,为什么没有?

09-30 21:36