¿Por qué (aparentemente) a hacer una diferencia acerca de mi aprobación null
como argumento directamente, o pasar un Object
que le asigna el valor null
?Java despacho método con un argumento nulo
Object testVal = null;
test.foo(testVal); // dispatched to foo(Object)
// test.foo(null); // compilation problem -> "The method foo(String) is ambiguous"
public void foo(String arg) { // More-specific
System.out.println("foo(String)");
}
public void foo(Object arg) { // Generic
System.out.println("foo(Object)");
}
En otras palabras, ¿por qué el (comentado en salir) segunda llamada a foo(...)
no envió a foo(Object)
?
Actualización: Uso Java 1.6. Pude compilar el código de Hemal sin problemas, pero el mío todavía no compila. La única diferencia que veo es que los métodos de Hemal son estáticos mientras que los míos no. Pero realmente no veo por qué esto debería hacer la diferencia ...?
Actualización 2: Resuelto. Tenía otro método foo (Runnable) en mi clase, por lo que el despachador no pudo seleccionar inequívocamente el método más específico. (Vea mi comentario en la segunda respuesta de Hemal.) Gracias a todos por su ayuda.
Acabo de probar esto y estoy sorprendido de que (a) 6u11 no dice que es ambiguo, y (b) que nulo se resuelve en Cadena no Objeto. Aprende algo nuevo todos los días: +1 para la lección. –
@Software Monkey: una vez que acepta que la constante nula es de tipo nulo y el tipo nulo es un subtipo de todos los tipos, esto es bastante obvio. Objeto
Pedantería: el método está anulando Objeto con cadena. La sobrecarga es cuando el nombre del método es el mismo, pero la firma varía más ampliamente. Excelente respuesta Gracias. – Sam