2011-04-27 8 views
21

Encontré un lugar en algún código en el que estoy trabajando, donde null se convierte en Object mientras se pasa a un método.¿Por qué lanzar nulo a Object?

¿Por qué se haría esto?

Conozco this question que trata sobre métodos sobrecargados, y usa el molde para determinar qué versión del método llamar.

Pero si el molde no se realizó, ¿no se elegiría un método sobrecargado con un parámetro escrito como Object sobre cualquier otra versión coincidente del método si se llama al método con un argumento nulo? Entonces, ¿qué más logra el elenco?

+0

posible duplicado de [¿Por qué lanzamiento nulo?] (Http://stackoverflow.com/questions/315846/why-null-cast) –

Respuesta

38

Si el yeso donde no a cabo, a continuación, los más específicos versión sería elegido.

null podría ser una referencia null de tipo String o del tipo Object. Entonces, si esos dos métodos están disponibles, se llamará al método String.

Si tiene métodos con Object, IntegeryString luego llamar que con null (y sin molde) daría un error de compilación porque Integer y String son válidos y igualmente específicas (es decir, no es una especialización de el otro). En ese caso, tiene para emitir null para especificar a qué método llamar.

+0

Aunque estoy de acuerdo con su respuesta, pero creo que la primera afirmación no es correcta, es decir, el compilador siempre intenta ubicar la coincidencia más específica si se aplica más de un método, por ejemplo, si arroja nulo para decir Integer y tiene un método sobrecargado con el tipo de objeto y el argumento de tipo de número, respectivamente, se resolverá en uno con el tipo de número (es decir, el más específico). – sactiw

-2

"Pero si no se realiza el reparto, sería no un método sobrecargado con un parámetro introducido como objeto ser elegido sobre cualquier otra versión correspondiente del método si el método se llama con un argumento nulo?"

No, porque 'nulo' no tiene ningún tipo, obtendría un error de compilación.

+4

Incorrecto. ** Solo ** obtiene un error de compilación si hay más de una sobrecarga "más específica". –

+0

Estaba asumiendo que tenía más de un método, está incrustado en la pregunta. – cbz

14

El "método Object" es siempre el método "menos específico" entre todos los "métodos aplicables". Es por eso que no sería elegido por el compilador.

Si ejecuta

String.valueOf(null); 

A continuación, el compilador tiene la opción de dos "métodos aplicables". En realidad estás llamando al método más específico

String.valueOf((char[]) null); 

que le dará un NullPointerException. Con el fin de llamar a otro método, escribir

String.valueOf((Object) null); 

En este caso, se quedará con sólo un "método aplicable", por lo que no tiene el problema de un método diferente, siendo sobrecargada "más específica".

+0

+1 para 'String.valueOf (Object o)' es la coincidencia "menos específica" entre todas las posibles coincidencias. Sin embargo, tendría sentido mencionar también que en el caso de String, si no se realiza un lanzamiento específico, entonces la coincidencia "más específica" que nos queda es 'String.valueOf (Char [] c)' y así se llama. ** Nota: ** el compilador java siempre resuelve los métodos sobrecargados al que tiene la coincidencia "más específica" y, si no lo hace, dará un error de compilación de "la referencia al método es ambiguo". – sactiw

+0

@sactiw: Gracias por la pista. Sí, he escrito mal 'char []' vs 'byte []' allí ... –

0

Aunque las respuestas anteriores ya explican qué sucede si lanzas nulo a Object vs. si no lanzas null a Object, pero me gustaría añadir algunos puntos faltantes.

Por lo tanto, en Java, las "matrices" son objetos lo que significa que se pueden asignar a Tipo de objeto, es decir,si lo haces new char[0].getClass().getSuperclass() da java.lang.Object y por lo tanto en caso de que null no se presente explícitamente, el compilador elige valueOf(char[]) sobre valueOf(Object) como el método más aplicable.

Sin embargo, aquí viene la parte que falta, si hubiera habido otro método sobrecargado que se acepta un parámetro tipo de interfaz (recordar interfaz no se extienden clase de objetos para que ellos también causan ambigüedad en la selección del método más específico), por ejemplo, valueOf (CharSequence), entonces esto habría dado lugar a un error de tiempo de compilación (es decir, la referencia a valueOf es ambigua) porque el compilador no podría elegir el método más aplicable.

Así que la línea inferior es evite pasar nulo como argumentos a los métodos más bien siempre los convierte a tipo param del método que se está llamando. :)

Cuestiones relacionadas