Por lo tanto, parece obvio que solo tiene que boxear si la condición es verdadera, y no debería haber boxeo si la condición es falsa. Sin embargo, la expresión de operador ternario debe tener un tipo estático. Entonces tenemos Long
y long
. El JLS establece que el resultado será el primitivo (igual de bien, imagínese si el operador fue, por ejemplo, +
o incluso ==
). Entonces el operador ternario forzará el desempaquetado, y solo entonces la asignación causará un boxeo.
Si se va a reemplazar el código con el equivalente if-else
, entonces usted acaba de tener asignaciones de long
a Long
y desde Long
a Long
, que no tendría ningún unboxing y así correr bien.
IIRC, esto está cubierto es Bloch & Puzzles de Java de Gafter.
Hace una v = ((1 == 2)? Long.MAX_VALOR: (Largo) nulo); esto siempre es falso, por lo que siempre intentas lanzar nulo a Long. Esto parece no ser permitido y arroja su excepción. – evildead
¿Por qué tendrías esa línea de código? ¿Curiosidad intelectual o es un fragmento del código de producción real? – Paul
@Paul and evildead, parece un código de ejemplo para demostrar el orden de unboxing. – Steven