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(я знаю, разница можетбыть огромным, но все же)?