Java 语言规范 : LambdaExpression in Java ConditionalExpression

标签 java language-features

在 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/

相关文章:

C1x : When will it land, 会发生什么?

c++ - 为什么只允许一个隐式转换将参数解析为 C++ 中的函数?

programming-languages - 有其他语言中的Ruby的method_missing等效项吗?

java - 正则表达式检测空行作为结束

java - 如果其中一个输入错误,则额外运行一次循环

java - 为什么建议避免外键上的单向一对多关联?

programming-languages - 何时使用处理语言?

swift - 为什么枚举在 Swift 中有计算属性但没有存储属性?

java - Maven 没有正确选择 JAVA_HOME

java - 循环中字符串连接的误报 SonarQube 违规