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 Integertodos podem assumir nullcomo 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 Objectversão-. Portanto, se apenas esses dois métodos existirem, a char[]versão será escolhida.
Quando as versões char[]e Integerestão disponíveis, as duas são mais específicas que Objectnenhuma, 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 nullou 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.
Integerparaint.