使用条件运算符而不分配其结果

sch*_*ein 3 java conditional-operator

为什么我必须将以下条件表达式的结果分配给变量才能使其编译?

piece.isWhite() ? whitePieceSquares.add(getSquare(pos)) : blackPieceSquares.add(getSquare(pos));
Run Code Online (Sandbox Code Playgroud)

以上不编译,下面做了:

boolean garbage = piece.isWhite() ? whitePieceSquares.add(getSquare(pos)) : blackPieceSquares.add(getSquare(pos));
Run Code Online (Sandbox Code Playgroud)

List#add()返回一个布尔值,但我会忽略它.只是条件运算符的设计方式是必须分配从函数返回的值,那些返回函数必须具有相同的类型吗?

Jon*_*eet 5

JLS的第14.8节(表达式陈述):

某些类型的表达式可以用分号跟随它们作为语句:

ExpressionStatement:
      StatementExpression ;

StatementExpression:
       Assignment
       PreIncrementExpression
       PreDecrementExpression
       PostIncrementExpression
       PostDecrementExpression
       MethodInvocation
       ClassInstanceCreationExpression
Run Code Online (Sandbox Code Playgroud)

通过计算表达式来执行表达式语句; 如果表达式具有值,则丢弃该值.当且仅当表达式的评估正常完成时,表达式语句的执行才能正常完成.

与C和C++不同,Java编程语言只允许某些形式的表达式用作表达式语句.

...

另一方面,该语言允许表达式语句中所有最有用的表达式,并且它不需要用作表达式语句的方法调用来调用void方法,因此几乎不需要这样的技巧.如果需要技巧,可以使用赋值语句(第15.26节)或局部变量声明语句(第14.4节).

基本上,条件运算符的主要目的是评估其操作数 - 您将其用于副作用.

Peter Lawrey的答案显示了一个更好的用法 - 你使用条件运算符来确定将哪个方块添加到其中,然后在其上调用方法.