私は、より洗練された方法で次の条件を実装しようとしています。
if (x > 1)
doSomething();
else {
doSomethingElse();
}
次のようにコーディングします。
(x > 1) ? doSomething() : doSomethingElse();
これはまったく不可能ですか?
私は、より洗練された方法で次の条件を実装しようとしています。
if (x > 1)
doSomething();
else {
doSomethingElse();
}
次のようにコーディングします。
(x > 1) ? doSomething() : doSomethingElse();
これはまったく不可能ですか?
doSomething()
返品の場合不可 void
。JLS 15.25を参照
最初の式は boolean または Boolean 型である必要があります。そうしないと、コンパイル時エラーが発生します。
2 番目または 3 番目のオペランド式が void メソッドの呼び出しであることは、コンパイル時エラーです。
実際、式ステートメントの文法 (§14.8) により、void メソッドの呼び出しが発生する可能性のあるコンテキストで条件式を使用することは許可されていません。
最終的に、2 番目と 3 番目のオペランドは同じ型に評価される必要があります。この評価がどのように行われるかは、JLS にも記載されています。
PS:doSomething()
なぜ両方true
またはを使いたいのfalse
ですか?
次のように書くことができます。
i = (x > 1) ? doSomething() : doSomethingElse();
しかし、このように直接ではありません:
(x > 1) ? doSomething() : doSomethingElse();
JLS §14.8の場合:
14.8. 式ステートメント
特定の種類の式は、セミコロンを続けてステートメントとして使用できます。
式ステートメント: ステートメント式; ステートメント式: 割り当て PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression メソッド呼び出し ClassInstanceCreationExpression
そこにはありませんConditionalExpression
。
完全な一般論ではありません。三項 (正式には三項は式が必要です) の引数は、同じ型に評価される必要があります。
doSomething() がvoid
型である場合は、そうではありません。
三項は、インライン if 条件に使用されます。次のようなものを書くことができるため、戻り値が必要です。
System.out.println((x > 1) ? "True" : "False");
void では、これは不可能です
戻り値の型に依存します。このように定義すると、void doSomething()
それは不可能です。