Java tenterà sempre di utilizzare la versione applicabile più specifica di un metodo disponibile (vedere JLS § 15.12.2 ).
Object
, char[]
E Integer
possono tutti prendere null
come 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 Object
versione. Quindi, se esistono solo questi due metodi, char[]
verrà scelta la versione.
Quando entrambe le versioni char[]
e Integer
sono disponibili, entrambe sono più specifiche di Object
ma 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 null
o 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.
Integer
aint
.