Als je dit leest, is de kans groot dat je de foutmelding Het methode X is ambigu voor het type Y
kreeg bij het compileren van een Java-programma in de terminal of in een willekeurige Java IDE.
Java ambiguïteit methodeoproep
Hier ga ik uitleggen waarom de foutmelding ‘Java ambiguïteit methodeoproep’ optreedt met enkele voorbeelden. Deze foutmelding voor ambiguïteit van methoden treedt altijd op bij methode-overbelasting waarbij de compiler niet kan bepalen welke van de overbelaste methoden moet worden gebruikt. Stel dat we een Java-programma hebben zoals hieronder.
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);
}
}
Het bovenstaande programma compileert perfect en wanneer we het uitvoeren, wordt “String” afgedrukt. Dus de methode foo(String s)
werd aangeroepen door het programma. De reden hiervoor is dat de Java-compiler probeert de methode met de meest specifieke invoerparameters te vinden om een methode aan te roepen. We weten dat Object de bovenliggende klasse van String is, dus de keuze was gemakkelijk. Hier is het uittreksel uit de Java-taal specificatie.
Als meer dan één lidmethode zowel toegankelijk als toepasbaar is voor een methodeaanroep … De Java-programmeertaal gebruikt de regel dat de meest specifieke methode wordt gekozen.
De reden dat ik “null” doorgeef, is omdat het werkt voor elk type argumenten, als we andere objecten doorgeven, is de keuze van methode voor de Java-compiler eenvoudig.
Het methode X is ambigu voor het type Y
Voeg nu de onderstaande methode toe aan de bovenstaande code.
public void foo(Integer i){
System.out.println("Integer");
}
Je krijgt een compileerfout omdat
De methode foo(Object) is ambigu voor het type Test
omdat zowel de klasse String als Integer Object als ouderklasse hebben en er geen overerving is. Dus de java-compiler beschouwt geen van beide als specifieker, vandaar de fout bij het oproepen van de ambigue methode.
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);
}
}
Zoals hierboven uitgelegd, is foo(NullPointerException ne)
de meest specifieke methode omdat deze is geërfd van de Exception-klasse en daarom compileert deze code prima en wanneer deze wordt uitgevoerd, wordt “NullPointerException” afgedrukt. Ik hoop dat dit artikel eventuele twijfels wegneemt die je hebt over de ambiguïteit van de methodeoproepfout van de java-compiler, reageer alsjeblieft als je iets wilt toevoegen of als je verward bent over dit onderwerp.