Sé que cuando lea la respuesta a esto veré que he pasado por alto algo que estaba bajo mis ojos. Pero he pasado los últimos 30 minutos tratando de resolverlo yo mismo sin resultado.Conversión de null a int possible?
Entonces, estaba escribiendo un programa en Java 6 y descubrí algo (para mí) característica extraña. Para tratar de aislarlo, he hecho dos pequeños ejemplos. primera vez que trató el siguiente método:
private static int foo()
{
return null;
}
y el compilador lo rechazaron: tipo incorrecto: no se puede convertir de nula a int.
Esto está bien conmigo y respeta la semántica de Java con la que estoy familiarizado. Luego he intentado lo siguiente:
private static Integer foo(int x)
{
if (x < 0)
{
return null;
}
else
{
return new Integer(x);
}
}
private static int bar(int x)
{
Integer y = foo(x);
return y == null ? null : y.intValue();
}
private static void runTest()
{
for (int index = 2; index > -2; index--)
{
System.out.println("bar(" + index + ") = " + bar(index));
}
}
Este compila sin errores! Pero, en mi opinión, debería haber un error de conversión de tipo en la línea
return y == null ? null : y.intValue();
Si ejecuto el programa me da el siguiente resultado:
bar(2) = 2
bar(1) = 1
bar(0) = 0
Exception in thread "main" java.lang.NullPointerException
at Test.bar(Test.java:23)
at Test.runTest(Test.java:30)
at Test.main(Test.java:36)
Puede explicar este comportamiento?
actualización
Muchas gracias por las muchas respuestas que aclaran. Estaba un poco preocupado porque este ejemplo no correspondía a mi intuición. Una cosa que me molestó fue que un nulo se estaba convirtiendo en un int y me preguntaba cuál sería el resultado : 0 como en C++? Eso hubiera sido muy extraño. Está bien que la conversión no sea posible en el tiempo de ejecución (excepción del puntero nulo).
¿Cuál es la regla general de cómo el compilador intenta resolver tipos en una expresión ternaria? –
+1, esto tiene sentido ahora, para mí. ¿Por qué el compilador no permite la primera prueba, 'int foo() {return null; } ', como en este caso, ¿debería autobox' null' a 'Integer'? o, supongo que mi pregunta en otras palabras es, ¿por qué elige autobox los campos en la operación ternaria a 'Integer' y no los deja como primitivos? ¿Dónde se basa esa decisión? – c00kiemon5ter
@Oli No estoy seguro, pero puede tener un comportamiento sorprendente, de lo cual este es un ejemplo. Ver [párrafo 15.25] (http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.25) del JLS. – Jesper