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

    【讨论】:

      最近更新 更多