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
在条件表达式的第二部分可以,而在第三部分却不行?
在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
在条件表达式的第二部分可以,而在第三部分却不行?