0

私は、より洗練された方法で次の条件を実装しようとしています。

if (x > 1) 
 doSomething();
else {
 doSomethingElse();
}

次のようにコーディングします。

(x > 1) ? doSomething() : doSomethingElse();

これはまったく不可能ですか?

4

5 に答える 5

4

doSomething()返品の場合不可 voidJLS 15.25を参照

最初の式は boolean または Boolean 型である必要があります。そうしないと、コンパイル時エラーが発生します。

2 番目または 3 番目のオペランド式が void メソッドの呼び出しであることは、コンパイル時エラーです。

実際、式ステートメントの文法 (§14.8) により、void メソッドの呼び出しが発生する可能性のあるコンテキストで条件式を使用することは許可されていません。

最終的に、2 番目と 3 番目のオペランドは同じ型に評価される必要があります。この評価がどのように行われるかは、JLS にも記載されています。

PS:doSomething()なぜ両方trueまたはを使いたいのfalseですか?

于 2013-07-04T09:13:09.407 に答える
2

次のように書くことができます。

i = (x > 1) ? doSomething() : doSomethingElse();

しかし、このように直接ではありません:

(x > 1) ? doSomething() : doSomethingElse();

JLS §14.8の場合:

14.8. 式ステートメント

特定の種類の式は、セミコロンを続けてステートメントとして使用できます。

式ステートメント:
    ステートメント式;

ステートメント式:
    割り当て
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    メソッド呼び出し
    ClassInstanceCreationExpression

そこにはありませんConditionalExpression

于 2013-07-04T09:16:16.860 に答える
1

完全な一般論ではありません。三項 (正式には三項はが必要です) の引数は、同じ型に評価される必要があります。

doSomething() がvoid型である場合は、そうではありません。

于 2013-07-04T09:12:52.450 に答える
0

三項は、インライン if 条件に使用されます。次のようなものを書くことができるため、戻り値が必要です。

System.out.println((x > 1) ? "True" : "False");

void では、これは不可能です

于 2013-07-04T09:17:27.853 に答える
0

戻り値の型に依存します。このように定義すると、void doSomething()それは不可能です。

于 2013-07-04T09:15:57.057 に答える