Metodo Sovraccarico per argomento nullo

Ho aggiunto tre metodi con parametri:

public static void doSomething(Object obj) { System.out.println("Object called"); } public static void doSomething(char[] obj) { System.out.println("Array called"); } public static void doSomething(Integer obj) { System.out.println("Integer called"); } 

Quando chiamo doSomething(null) , il compilatore genera l’errore come metodi ambigui . Quindi il problema è dovuto ai metodi Integer e char[] o ai metodi Integer e Object ?

Java tenterà sempre di utilizzare la versione più specifica applicabile di un metodo disponibile (vedere JLS §15.12.2 ).

Object , char[] e Integer possono assumere null come valore valido. Pertanto sono applicabili tutte e 3 le versioni, quindi Java dovrà trovare quello più specifico.

Dato che Object è il super-tipo di char[] , la versione dell’array è più specifica della versione Object . Quindi, se esistono solo questi due metodi, verrà scelta la versione di char[] .

Quando sono disponibili entrambe le versioni char[] e Integer , 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 inviando l’argomento al tipo appropriato.

Si noti che in pratica questo problema si verifica molto più raramente di quanto si possa pensare. La ragione di ciò è che accade solo quando si chiama esplicitamente un metodo con null o con una variabile di un tipo piuttosto non specifico (come Object ).

Al contrario, la seguente invocazione sarebbe perfettamente inequivocabile:

 char[] x = null; doSomething(x); 

Sebbene tu stia ancora passando il valore null , Java sa esattamente quale metodo chiamare, dal momento che terrà conto del tipo di variabile.

Ogni coppia di questi tre metodi è ambigua di per sé quando viene chiamata con un argomento null . Perché ogni tipo di parametro è un tipo di riferimento.

I seguenti sono i tre modi per chiamare uno dei tuoi metodi specifici con null.

 doSomething( (Object) null); doSomething( (Integer) null); doSomething( (char[]) null); 

Posso suggerire di rimuovere questa ambiguità se si prevede di chiamare questi metodi con argomenti null . Un tale disegno invita a errori in futuro.

null è un valore valido per uno dei tre tipi; quindi il compilatore non può decidere quale funzione usare. Utilizzare invece qualcosa come doSomething((Object)null) o doSomething((Integer)null) .

Ogni class in Java estende la class Object. Anche la class Integer estende Object. Quindi sia Object che Integer sono considerati come istanze Object. Quindi, quando si passa null come parametro rispetto al compilatore, viene confuso quello che il metodo object chiama, ovvero Con parametro Oggetto o parametro Numero intero poiché entrambi sono oggetti e il loro riferimento può essere nullo. Ma i primitivi in ​​Java non estendono l’object.

Ho provato questo e quando c’è esattamente una coppia di metodi sovraccaricati e uno di loro ha un tipo di parametro Oggetto, quindi il compilatore selezionerà sempre il metodo con un tipo più specifico. Ma quando c’è più di un tipo specifico, il compilatore genera un errore di metodo ambiguo.

Poiché si tratta di un evento a tempo di compilazione, ciò può accadere solo quando si passa intenzionalmente null a questo metodo. Se questo viene fatto intenzionalmente, allora è meglio sovraccaricare questo metodo di nuovo senza parametri o creare un altro metodo.

c’è un’ambiguità a causa di doSomething (char [] obj) e doSomething (Integer obj).

char [] e Integer sono entrambi uguali per null perché sono ambigui.

 class Sample{ public static void main (String[] args) { Sample s = new Sample(); s.printVal(null); } public static void printVal(Object i){ System.out.println("obj called "+i); } public static void printVal(Integer i){ System.out.println("Int called "+i); } } 

L’output è Int chiamato null e quindi l’ambiguità è con char [] e Integer