Java siempre intentará usar la versión aplicable más específica de un método que esté disponible (consulte JLS §15.12.2 ).
Object
, char[]
y Integer
todos pueden tomarse null
como un valor válido. Por lo tanto, las 3 versiones son aplicables, por lo que Java tendrá que encontrar la más específica.
Como Object
es el supertipo de char[]
, la versión de matriz es más específica que la Object
versión. Entonces, si solo existen esos dos métodos, char[]
se elegirá la versión.
Cuando están disponibles las versiones char[]
y Integer
, ambas son más específicas que Object
ninguna, pero ninguna es más específica que la otra, por lo que Java no puede decidir a cuál llamar. En este caso, tendrá que mencionar explícitamente a cuál desea llamar enviando el argumento al tipo apropiado.
Tenga en cuenta que en la práctica este problema ocurre mucho más raramente de lo que uno podría pensar. La razón de esto es que solo sucede cuando está llamando explícitamente a un método con null
o con una variable de un tipo bastante inespecífico (como Object
).
Por el contrario, la siguiente invocación sería perfectamente inequívoca:
char[] x = null;
doSomething(x);
Aunque todavía está pasando el valor null
, Java sabe exactamente a qué método llamar, ya que tendrá en cuenta el tipo de variable.
Integer
aint
.