in modo che appaia evidente che hai solo di box se la condizione è vera, e non ci dovrebbero essere boxe, se la condizione è falsa. Tuttavia, l'espressione dell'operatore ternario deve avere un particolare tipo statico. Quindi abbiamo Long
e long
. Il JLS afferma che il risultato sarà il primitivo (altrettanto bene - immagina se l'operatore fosse, per esempio, +
o anche ==
). Quindi l'operatore ternario forzerà l'unboxing, e solo allora l'assegnazione causerà un pugilato.
Se si dovesse sostituire il codice con l'equivalente if-else
, allora si sarebbe semplicemente avere un incarico da long
a Long
e da Long
a Long
, che non avrebbe alcun unboxing e così funzionare bene.
IIRC, questo è coperto è Bloch & Java Puzzlers di Gafter.
fonte
2011-12-15 03:04:15
Si esegue a v = ((1 == 2)? Long.MAX_VALUE: (Long) null); questo è sempre falso, quindi provi sempre a trasmettere null a Long. Questo sembra non essere permesso e getta la tua eccezione. – evildead
Perché dovresti avere una tale linea di codice? La curiosità intellettuale o è un frammento del codice di produzione attuale? – Paul
@Paul e evildead, sembra un codice di esempio per dimostrare l'ordine di unboxing. – Steven