2016-08-19 122 views
2

在Java 8規格有以下syntax description of the conditional operator ?:Java語言規範:LambdaExpression在Java中條件表達式

ConditionalExpression: 
ConditionalOrExpression 
ConditionalOrExpression ? Expression : ConditionalExpression 
ConditionalOrExpression ? Expression : LambdaExpression 

我明白的前兩行。但爲什麼第三行是必要的? LamdaExpression有什麼特別的地方需要明確聲明,在這裏?我在下面的文字中沒有看到這個問題。

回答

2

我想我知道答案,但它很奇怪。

以下是第15章報價:運營商之間

優先級由語法 生產的層級管理。最低優先級運算符是lambda表達式( - >)的lambda表達式的箭頭,後跟賦值運算符。因此,所有 表達式語法包含在LambdaExpression和 AssignmentExpression非終結符:

表達:LambdaExpression AssignmentExpression

的條件表達式是AssignmentExpression的一部分:

AssignmentExpression:條件表達式分配

如您所述,ConditionalExpression的第三部分只能是ConditionalExpression,而不是Expression

使第三部分爲Expression將包括像Assignment不可取的事情:

a? b : c=d // bad idea? 

但是,限制第三部分ConditionalExpression而不是Expression省去了LambdaExpression,所以現在需要與

明確添加

Conditional Or Expression?表達:LambdaExpression

這實際上帶來了一個問題:怎麼來Assignment是條件表達式的第二部分確定,但三分不中?