Java三元运算符(?:)不起作用; 第二个或第三个操作数返回布尔值

dei*_*rus 2 java ternary-operator

有人能告诉我为什么三元运算符的使用不正确吗?操作数2和3返回一个布尔值.

public class Something {
...
private static final double REFERENCE_FRAME_MID_X = 0;
private static final double REFERENCE_FRAME_MID_Y = 0;

private boolean findInsideOrOutsideGeneralEllipse(Point2D destCirclePos) {
    List<Boolean> returnValue = new ArrayList<>();
    Point2D referenceFrameCenter = new Point2D.Double(REFERENCE_FRAME_MID_X, REFERENCE_FRAME_MID_Y);
    Ellipse2D insideAreaEllipse2D = getEllipse2D(referenceFrameCenter.getX(), referenceFrameCenter.getY(),
                                                    destCirclePos.distance(referenceFrameCenter));

    // doesn't work
    insideAreaEllipse2D.contains(destCirclePos) ? returnValue.add(true) : returnValue.add(false);

    // works
    if (insideAreaEllipse2D.contains(destCirclePos)) {
        returnValue.add(true);
    } else {
        returnValue.add(false);
    }
}
...
}
Run Code Online (Sandbox Code Playgroud)

Ily*_*lya 10

Java三元操作条件的用法应该是这样的

result = testCondition ? value1 : value2
Run Code Online (Sandbox Code Playgroud)

这是java语言规范.

平等,关系和条件运算符

在以下示例中,此运算符应读作:"如果someConditiontrue,则将value1的值赋给result.否则,将value2的值赋给result

  • 我不能说你为什么被投票,但是没有要求将三元表达式的结果用作_assignment_的右手边.`条件?val1:va​​l2`是一个_expression_,虽然它不能用作语句,但是有很多地方可以使用表达式,而不仅仅是赋值.例如,你可以`System.out.println(condition?val1:va​​l2);`. (4认同)
  • @LuiggiMendoza。Joshua 正在谈论可以使用条件运算符的地方。它不仅在分配上下文中。`?:` 作为方法参数的用法,不是赋值上下文,而是方法调用上下文。 (2认同)
  • @LuiggiMendoza 我知道条件表达式不是 _statement_。我的观点是 _expression_ 可以在赋值以外的其他地方使用。[Rohit Jain 的回答](http://stackoverflow.com/a/19010424/1281433) 引用了有关语法的规范,并使其更加清晰。 (2认同)

Roh*_*ain 5

来自JLS - 条件运算符:

事实上,通过表达式语句(第14.8节)的语法,条件表达式不允许出现在可能出现void方法调用的任何上下文中.

来自JLS - 14.8表达式语句的语法:

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

ExpressionStatement:
      StatementExpression ;

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

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

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

现在你使用条件运算符的方式不是一个有效的表达式语句,从它的语法推断出来.因此,您会收到编译器错误.您必须在上述任何上下文中使用它.