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

时间:2013-09-25 16:28:50

标签: 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);
    }
}
...
}

2 个答案:

答案 0 :(得分:10)

Java三元操作条件的使用应该类似于

result = testCondition ? value1 : value2

它是java语言规范。

Equality, Relational, and Conditional Operators

  

在以下示例中,   此运算符应理解为:“如果 someCondition true ,请指定   值 value1 的结果。否则,将 value2 的值指定给   结果

答案 1 :(得分:5)

来自JLS - Conditional Operator

  

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

expression statements from JLS - 14.8的语法:

  

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

ExpressionStatement:
      StatementExpression ;

StatementExpression:
       Assignment
       PreIncrementExpression
       PreDecrementExpression
       PostIncrementExpression
       PostDecrementExpression
       MethodInvocation
       ClassInstanceCreationExpression
     

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

     

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

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