【问题标题】:Java language spec: LambdaExpression in Java ConditionalExpressionJava 语言规范:Java ConditionalExpression 中的 LambdaExpression
【发布时间】:2023-04-13 13:26:01
【问题描述】:
在 Java 8 规范中有以下syntax description of the conditional operator ?::
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
ConditionalOrExpression ? Expression : LambdaExpression
我理解前两行。但是为什么需要第三行呢? LamdaExpression 有什么特别之处需要在这里显式声明?我在下面的文本中没有看到这个讨论。
【问题讨论】:
标签:
java
language-features
【解决方案1】:
我想我知道答案,但很奇怪。
这是第 15 章的引述:
运算符之间的优先级由语法层次结构管理
制作。最低优先级运算符是 lambda 的箭头
表达式 (->),后跟赋值运算符。因此,所有
表达式在语法上包含在 LambdaExpression 和
AssignmentExpression 非终结符:
表达式:LambdaExpression 赋值表达式
ConditionalExpression 是 AssignmentExpression 的一部分:
AssignmentExpression:条件表达式赋值
正如您所引用的,ConditionalExpression 的第三部分只能是ConditionalExpression,而不是Expression。
将第三部分变成Expression 会包含不受欢迎的内容,例如Assignment:
a? b : c=d // bad idea?
但是,将第三部分限制为ConditionalExpression 而不是Expression 忽略了LambdaExpression,所以现在需要使用
显式添加
条件或表达式?表达式:LambdaExpression
这实际上带来了下一个问题:为什么Assignment在条件表达式的第二部分可以,而在第三部分却不行?