Java boxeo auto / wierdness unboxing [duplicado]
-
27-09-2019 - |
Pregunta
Duplicados posibles:
booleanos, operadores condicionales y autoboxing
Java, Google colecciones de la biblioteca; AbstractIterator problema?
El código siguiente produce un NPE:
Integer test = null;
Integer test2 = true ? test : 0;
System.out.println(test2);
Para imprimir correctamente "nulo" sin excepción requiere este código:
Integer test = null;
Integer test2 = true ? test : (Integer)0;
System.out.println(test2);
Es obvio que en el primer ejemplo de que "prueba" se sacó de la caja (se convierte a int nativo), pero ¿por qué? Y por qué no cambiar la otra expresión en el operador ternario (como en el segundo ejemplo) solucionarlo? ¿Alguien puede ofrecer algún tipo de narrativa de exactamente cuándo, qué y por qué cosas en los dos ejemplos se sacó de la caja y caja?
Solución
sección 15.25 de la especificación del lenguaje Java :
El tipo de una expresión condicional se determina como sigue:
- Si el segundo y tercer operandos tienen el mismo tipo (que puede ser del tipo null), a continuación, que es el tipo de la expresión condicional.
- Si uno de los segundo y tercer operandos es de tipo booleano y el tipo de la otra es de tipo booleano, entonces el tipo de la expresión condicional es booleano.
- Si uno de los segundo y tercer operandos es del tipo nulo y el tipo de la otra es un tipo de referencia, entonces el tipo de la expresión condicional es que tipo de referencia.
- lo contrario, si el segundo y tercer operandos tienen tipos que son convertible (§5.1.8) para tipos numéricos, a continuación, hay varios casos:
- Si uno de los operandos es de tipo byte o byte y el otro es de tipo corto o corto, entonces el tipo de la expresión condicional es corto.
- Si uno de los operandos es de tipo T, donde T es byte, short, o char, y el otro operando es una expresión constante de tipo int cuyo valor es representable en el tipo T, entonces el tipo de la expresión condicional es T .
- Si uno de los operandos es de tipo Byte y el otro operando es una expresión constante de tipo int cuyo valor es representable en el byte de tipo, entonces el tipo de la expresión condicional es byte.
- Si uno de los operandos es de tipo corto y el otro operando es una expresión constante de tipo int cuyo valor es representable en el tipo corto, entonces el tipo de la expresión condicional es corto.
- Si uno de los operandos es de tipo; Carácter y el otro operando es una expresión constante de tipo int cuyo valor es representable en el tipo char, entonces el tipo de la expresión condicional es CHAR.
- Si no, promoción numérica binaria (§5.6.2) se aplica a los tipos de operando, y el tipo de la expresión condicional es el tipo promovido de la segunda y tercera operandos. Tenga en cuenta que tipo numérico binario lleva a cabo la promoción de conversión unboxing (§5.1.8) y la conversión de juegos de valor (§5.1.13).
Por lo que es después de la última bala, realizando promoción numérica binaria, que realiza una conversión unboxing. Por lo que el tipo de la expresión operador condicional es int
, a pesar de que usted está asignando a un Integer
. Se trata de intentar realizar la conversión unboxing en null
, por lo tanto, la excepción.