在 Java 8 规范中有以下内容 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
条件表达式是赋值表达式的一部分:
AssignmentExpression: ConditionalExpression Assignment
正如您引用的那样,ConditionalExpression
的第三部分只能是ConditionalExpression
,不是 Expression
.
将第三部分设为Expression
会包括不需要的东西,例如 Assignment
:
a? b : c=d // bad idea?
但是,将第三部分限制为 ConditionalExpression
而不是Expression
遗漏LambdaExpression
,所以现在需要用
ConditionalOrExpression ? Expression : LambdaExpression
这实际上带来了下一个问题:怎么会Assignment
条件表达式的第二部分可以,但第三部分不行?
关于Java 语言规范 : LambdaExpression in Java ConditionalExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39044451/