Логическая операция в Java

Я пытался выполнить следующее условие более изощренным способом:

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

хочу закодировать это как:

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

Это вообще невозможно?

5 ответов

Не возможно, если doSomething() возвращается void, См. JLS 15.25

Первое выражение должно иметь тип boolean или Boolean, иначе произойдет ошибка времени компиляции.

Это ошибка времени компиляции, поскольку второе или третье выражение операнда является вызовом метода void.

Фактически, согласно грамматике операторов выражений (§14.8), условному выражению не разрешается появляться в любом контексте, в котором может появляться вызов метода void.

В конце концов, второй и третий операнд должны оценивать один и тот же тип, как эта оценка также упоминается в JLS.

PS: почему вы хотите doSomething() для обоих true или же false?

Вы можете написать такие вещи:

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

Но не прямо так:

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

Потому что в JLS §14.8:

14.8. Выражения выражения

Определенные виды выражений можно использовать в качестве утверждений, следуя за ними через точку с запятой.

ExpressionStatement:
    StatementExpression;

StatementExpression:
    присваивание
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression

Здесь нет ConditionalExpression в этом.

Не в полной общности; аргументы в троичной форме (формально троичная требует выражений) должны быть одинакового типа.

Если doSomething() является void типа то точно нет.

Это зависит от типа возвращаемого значения. Если вы определите как это void doSomething() тогда это невозможно.

Тройной используется для встроенных условий. Им нужно возвращаемое значение, потому что вы могли бы написать что-то вроде этого:

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

с пустотой это было бы невозможно

Другие вопросы по тегам