NullPointerException через авто-бокс-поведение тернарного оператора Java

Я наткнулся на действительно странноеNullPointerException на днях вызвано неожиданным приведением типа в троичный оператор. Учитывая эту (бесполезную примерную) функцию:

Integer getNumber() {
    return null;
}

Я ожидал, что следующие два сегмента кода будут полностью идентичны после компиляции:

Integer number;
if (condition) {
    number = getNumber();
} else {
    number = 0;
}

против ..

Integer number = (condition) ? getNumber() : 0;

Оказывается, еслиcondition являетсяtrue,ifхорошо работает, а троичная операция во втором сегменте кодаNullPointerException, Кажется, что троичная операция решила привести оба варианта кint перед автоматической упаковкой результата обратно вInteger!?! На самом деле, если я явно приведу0 вInteger, исключение уходит. Другими словами:

Integer number = (condition) ? getNumber() : 0;

это не то же самое, что:

Integer number = (condition) ? getNumber() : (Integer) 0;

Таким образом, кажется, что есть разница в байт-коде между троичным оператором и эквивалентнымif-elseзаявление (что я не сделалне ожидаю). Что поднимает три вопроса: почему есть разница? Это ошибка в троичной реализации или есть причина для приведения типа? Учитывая разницу, является ли троичная операция более или менее производительной, чем эквивалентнаяif(я знаю, разница можетбыть огромным, но все же)?

Ответы на вопрос(3)

Ваш ответ на вопрос