Java 语言规范:Java ConditionalExpression 中的 LambdaExpression

Java language spec: LambdaExpression in Java ConditionalExpression

在Java8规范中有如下syntax description of the conditional operator ?:

ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
ConditionalOrExpression ? Expression : LambdaExpression 

前两行我看懂了。但是为什么第三行是必要的呢? LamdaExpression 有什么特别之处需要在这里明确声明?我没有在以下文本中看到这一点。

我想我知道答案了,但它很奇怪。

这是第 15 章的引述:

Precedence among operators is managed by a hierarchy of grammar productions. The lowest precedence operator is the arrow of a lambda expression (->), followed by the assignment operators. Thus, all expressions are syntactically included in the LambdaExpression and AssignmentExpression nonterminals:

Expression: LambdaExpression AssignmentExpression

ConditionalExpression 是 AssignmentExpression 的一部分:

AssignmentExpression: ConditionalExpression Assignment

如您所言,ConditionalExpression 的第三部分只能是 ConditionalExpression,而不是 Expression

将第三部分变成 Expression 会包含不受欢迎的内容,例如 Assignment:

a? b : c=d // bad idea?

但是,将第三部分限制为 ConditionalExpression 而不是 Expression 遗漏了 LambdaExpression,因此现在需要使用

明确添加

ConditionalOrExpression ? Expression : LambdaExpression

这实际上带来了下一个问题:为什么Assignment在条件表达式的第二部分可以,而在第三部分却不行?