2

有人能告诉我为什么三元运算符的这种用法不正确吗?操作数 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);
    }
}
...
}
4

2 回答 2

10

Java 三元运算条件的用法应该是这样的

result = testCondition ? value1 : value2

这是java语言规范。

等式、关系和条件运算符

在以下示例中,此运算符应读作:“如果someConditiontrue,则将value1的值分配给 result。否则,将value2的值分配给 result

于 2013-09-25T16:34:38.723 回答
5

来自JLS - 条件运算符

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

JLS - 14.8 中的表达式语句语法:

某些类型的表达式可以通过在它们后面加上分号来用作语句:

ExpressionStatement:
      StatementExpression ;

StatementExpression:
       Assignment
       PreIncrementExpression
       PreDecrementExpression
       PostIncrementExpression
       PostDecrementExpression
       MethodInvocation
       ClassInstanceCreationExpression

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

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

现在,您使用条件运算符的方式不是有效的表达式语句,正如从它的语法中推断的那样。因此你得到编译器错误。您必须在上述任何上下文中使用它。

于 2013-09-25T16:29:56.070 回答