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の値を結果に割り当てます。それ以外の場合は、value2の値を結果に割り当てます。

于 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 に答える