Как работает `return ‹boolean exp› || ‹Object exp›` допустимый оператор возврата для метода, возвращающего объект?

Я читал книгу и увидел этот код:

public Animal getWinner(List<Animal> animals) {
    return animals == null || animals.size() == 0 ? null : animals.get(0);
}

Последнее выражение подходит, так как оно возвращает Animal или null. Однако предыдущее выражение вызывает недоумение, так как это просто логическое выражение.

Я сделал тестовый класс и назвал getWinner(null). Он вернул null. Насколько мне известно, animals == null будет истинным, выражение замкнется, и я ожидаю, что метод вернет true вместо null.

Как эта строка компилируется и даже работает так, как ожидалось?


person anotherwise    schedule 27.10.2018    source источник
comment
Вау, участник уже 8 лет и сейчас ты задаешь вопрос. Вы действительно прячетесь в тени :-)   -  person oligofren    schedule 28.10.2018
comment
Абсолютно! До встречи в 2026 году! ;)   -  person anotherwise    schedule 28.10.2018


Ответы (1)


Это связано с приоритетом оператора в Java. и какой оператор — логический или тернарный — будет выполнен первым.

Тернар имеет более низкий приоритет, поэтому or будет оцениваться первым, что означает, что это будет выглядеть так со скобками:

return (animals == null || animals.size() == 0) ? null : animals.get(0);

Таким образом, результатом всей строки будет либо return null, либо return animals.get(0).

person oligofren    schedule 27.10.2018
comment
Если сомневаетесь: добавьте скобки. Следующий программист будет вам благодарен :D - person oligofren; 28.10.2018