Java tenterà sempre di utilizzare la versione applicabile più specifica di un metodo disponibile (vedere JLS § 15.12.2 ).
Object, char[]E Integerpossono tutti prendere nullcome valore valido. Pertanto, tutte e 3 le versioni sono applicabili, quindi Java dovrà trovare quella più specifica.
Poiché Objectè il super-tipo di char[], la versione dell'array è più specifica della Objectversione. Quindi, se esistono solo questi due metodi, char[]verrà scelta la versione.
Quando entrambe le versioni char[]e Integersono disponibili, entrambe sono più specifiche di Objectma nessuna è più specifica dell'altra, quindi Java non può decidere quale chiamare. In questo caso dovrai menzionare esplicitamente quale vuoi chiamare lanciando l'argomento sul tipo appropriato.
Si noti che in pratica questo problema si verifica molto più raramente di quanto si possa pensare. La ragione di ciò è che succede solo quando chiami esplicitamente un metodo con nullo con una variabile di tipo piuttosto non specifico (come Object).
Al contrario, la seguente invocazione sarebbe perfettamente inequivocabile:
char[] x = null;
doSomething(x);
Anche se stai ancora passando il valore null, Java sa esattamente quale metodo chiamare, poiché prenderà in considerazione il tipo di variabile.
Integeraint.