NullPointerException através do comportamento de auto-boxing do operador ternário de Java

Eu tropecei em um realmente estranhoNullPointerException no outro dia causado por um inesperado tipo de conversão no operador ternário. Dada esta função (inútil exemplar):

Integer getNumber() {
    return null;
}

Eu esperava que os dois segmentos de código a seguir fossem exatamente idênticos após a compilação:

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

vs.

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

.

Acontece que, secondition étrue, aif-instrução funciona bem, enquanto a operação ternária no segundo segmento de código lança umNullPointerException. Parece que a operação ternária decidiu digitar as duas opções paraint antes de auto-encaixotamento o resultado de volta em umInteger!?! Na verdade, se eu explicitamente lançar o0 paraInteger, a exceção vai embora. Em outras palavras:

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

não é o mesmo que:

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

.

Então, parece que há uma diferença de código de byte entre o operador ternário e um equivalenteif-else-atravamento (algo que eu não esperava). O que levanta três questões: por que há uma diferença? Isso é um bug na implementação do ternário ou há algum motivo para o tipo de conversão? Dado que existe uma diferença, a operação ternária é mais ou menos de desempenho que um equivalenteif(Eu sei, a diferença não pode ser enorme, mas ainda assim)?

questionAnswers(3)

yourAnswerToTheQuestion