Por ejemplo:¿Por qué el compilador de Java a veces permite el desempaquetado de nulo?
int anInt = null;
falla en tiempo de compilación, pero
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("" + getSomeVal());
}
}
public static int getSomeVal() {
return new Random().nextBoolean() ? 1 : null;
}
falla (por lo general) en tiempo de ejecución. Intentar devolver solo null
también dará como resultado un error de compilación, así que supongo que hay algo acerca de tener varias rutas de acceso que hace que el compilador infiera que null
es potencialmente un autoboxed int
? ¿Por qué no puede javac compilar ambos casos con el mismo error?
El primer caso implica un "tipo" nulo que se convierte implícitamente en un tipo int, r Esulting en un error de compilación.El segundo caso implícitamente arroja nulo al tipo de variable de la izquierda, que es el tipo de expresión en lugar del valor de retorno. Supongo que una lectura cuidadosa de JLS 15.25 "Si el segundo y tercer operandos tienen el mismo tipo (que puede ser del tipo nulo), entonces ese es el tipo de expresión condicional". te da esto, ya que el compilador java no puede dar un tipo nulo a null y por lo tanto se ve forzado a usar Integer para ambos al desempaquetar el 1. Respuesta muy clara, gracias. – MilesHampson