Java sempre tentará usar a versão aplicável mais específica de um método disponível (consulte JLS §15.12.2 ).
Object
, char[]
e Integer
todos podem assumir null
como um valor válido. Portanto, todas as três versões são aplicáveis, portanto, o Java precisará encontrar a mais específica.
Como Object
é o supertipo de char[]
, a versão do array é mais específica que a Object
versão-. Portanto, se apenas esses dois métodos existirem, a char[]
versão será escolhida.
Quando as versões char[]
e Integer
estão disponíveis, as duas são mais específicas que Object
nenhuma, mas nenhuma é mais específica que a outra; portanto, o Java não pode decidir qual delas chamar. Nesse caso, você precisará mencionar explicitamente qual você deseja chamar lançando o argumento para o tipo apropriado.
Observe que, na prática, esse problema ocorre muito mais raramente do que se possa pensar. A razão para isso é que isso só acontece quando você está chamando explicitamente um método com null
ou com uma variável de um tipo bastante inespecífico (como Object
).
Pelo contrário, a seguinte invocação seria perfeitamente inequívoca:
char[] x = null;
doSomething(x);
Embora você ainda esteja passando o valor null
, o Java sabe exatamente qual método chamar, pois levará em consideração o tipo da variável.
Integer
paraint
.