Se stai leggendo questo, è probabile che tu abbia ricevuto un errore `Il metodo X è ambiguo per il tipo Y
` durante la compilazione di un programma Java in terminale o in qualsiasi IDE Java.
Chiamata di metodo ambigua Java
Qui sto per spiegare perché si verifica l’errore di chiamata di metodo ambigua in Java con alcuni esempi. Questo errore di chiamata di metodo ambigua si verifica sempre con il sovraccarico del metodo in cui il compilatore non riesce a capire quale dei metodi sovraccaricati dovrebbe essere utilizzato. Supponiamo di avere un programma Java come quello seguente.
package com.journaldev.errors;
public class Test {
public void foo(Object o) {
System.out.println("Object");
}
public void foo(String s) {
System.out.println("String");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
Il programma sopra si compila perfettamente e quando lo eseguiamo, stampa “Stringa”. Quindi il metodo foo(String s)
è stato chiamato dal programma. Il motivo di ciò è che il compilatore Java cerca di trovare il metodo con i parametri di input più specifici per invocare un metodo. Sappiamo che Object è la classe genitore di String, quindi la scelta è stata facile. Ecco un estratto dalla Specifica del linguaggio Java.
Se più di un metodo membro è accessibile e applicabile a una chiamata di metodo … Il linguaggio di programmazione Java utilizza la regola che il metodo più specifico viene scelto.
Il motivo per cui sto passando “null” è perché funziona per qualsiasi tipo di argomento, se passiamo altri oggetti la scelta del metodo per il compilatore Java è facile.
Il metodo X è ambiguo per il tipo Y
Ora aggiungiamo il metodo sottostante al codice sopra.
public void foo(Integer i){
System.out.println("Integer");
}
Otterrai un errore di compilazione come
Il metodo foo(Object) è ambiguo per il tipo Test
perché sia la classe String che la classe Integer hanno Object come classe padre e non c’è ereditarietà. Quindi il compilatore Java non considera nessuno di essi più specifico, quindi si verifica l’errore di chiamata del metodo ambiguo.
package com.journaldev.strings;
public class Test {
public void foo(Object o) {
System.out.println("Object");
}
public void foo(Exception e) {
System.out.println("Exception");
}
public void foo(NullPointerException ne) {
System.out.println("NullPointerException");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
Come spiegato sopra, qui foo(NullPointerException ne)
è il metodo più specifico perché è ereditato dalla classe Exception e quindi questo codice si compila correttamente e, quando viene eseguito, stampa “NullPointerException”. Spero che questo articolo chiarisca eventuali dubbi che hai riguardo all’errore del compilatore di chiamata di metodo ambiguo in Java. Commenta se vuoi aggiungere qualcosa o se hai qualche confusione con questo.