Wenn Sie das lesen, besteht die Möglichkeit, dass Sie den Fehler Die Methode X ist für den Typ Y mehrdeutig
erhalten haben, wenn Sie ein Java-Programm im Terminal oder in einer Java-IDE kompilieren.
Java mehrdeutiger Methodenaufruf
Hier werde ich erklären, warum der Fehler „Java mehrdeutiger Methodenaufruf“ mit einigen Beispielen auftritt. Dieser Fehler beim mehrdeutigen Methodenaufruf tritt immer bei Methodenüberladung auf, bei der der Compiler nicht feststellen kann, welche der überladenen Methoden verwendet werden soll. Angenommen, wir haben ein Java-Programm wie unten dargestellt.
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);
}
}
Das obige Programm kompiliert perfekt und wenn wir es ausführen, gibt es „String“ aus. Also wurde die Methode foo(String s)
vom Programm aufgerufen. Der Grund dafür ist, dass der Java-Compiler versucht, die Methode mit den spezifischsten Eingabeparametern zu finden, um eine Methode aufzurufen. Wir wissen, dass Object die Elternklasse von String ist, daher war die Wahl einfach. Hier ist ein Auszug aus der Java Language Specification.
Wenn mehr als eine Membermethode sowohl zugänglich als auch anwendbar ist für einen Methodenaufruf … verwendet die Java-Programmiersprache die Regel, dass die spezifischste Methode gewählt wird.
Der Grund, warum ich „null“ übergebe, ist, weil es für jede Art von Argumenten funktioniert. Wenn wir andere Objekte übergeben, ist die Wahl der Methode für den Java-Compiler einfach.
Die Methode X ist für den Typ Y mehrdeutig.
Jetzt fügen wir unten stehende Methode zum obigen Code hinzu.
public void foo(Integer i){
System.out.println("Integer");
}
Sie erhalten einen Kompilierungsfehler, da
Die Methode foo(Object) ist für den Typ Test mehrdeutig
, weil sowohl die Klasse String als auch die Klasse Integer Object als Elternklasse haben und es keine Vererbung gibt. Daher betrachtet der Java-Compiler keine von ihnen als spezifischer, daher tritt der Fehler beim Aufruf der mehrdeutigen Methode auf.
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);
}
}
Wie oben erklärt, ist hier foo(NullPointerException ne)
die spezifischste Methode, da sie von der Exception-Klasse ererbt wird. Daher kompiliert dieser Code problemlos und gibt bei der Ausführung „NullPointerException“ aus. Ich hoffe, dieser Artikel klärt alle Zweifel bezüglich des Java-Fehlers beim mehrdeutigen Methodenaufruf des Compilers. Bitte kommentieren Sie, wenn Sie etwas hinzufügen möchten oder wenn Sie Verwirrung zu diesem Thema haben.