Ich habe drei Methoden mit Parametern hinzugefügt:
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");
}
Wenn ich aufrufe doSomething(null)
, gibt der Compiler Fehler als mehrdeutige Methoden aus . Also ist das Problem weil Integer
und char[]
Methoden oder Integer
und Object
Methoden?
java
oop
null
overloading
Phani
quelle
quelle
Integer
zuint
.reference to doSomething is ambiguous
Fehler nicht werfen .Antworten:
Java wird immer versuchen, die spezifischste anwendbare Version einer verfügbaren Methode zu verwenden (siehe JLS §15.12.2 ).
Object
,char[]
UndInteger
alle nehmen kannnull
als gültigen Wert. Daher sind alle 3 Versionen anwendbar, sodass Java die spezifischste finden muss.Da
Object
es sich um den Supertyp von handeltchar[]
, ist die Array-Version spezifischer als dieObject
-Version. Wenn also nur diese beiden Methoden existieren, wird diechar[]
Version ausgewählt.Wenn sowohl die
char[]
als auch dieInteger
Version verfügbar sind, sind beide spezifischer als,Object
aber keine ist spezifischer als die andere, sodass Java nicht entscheiden kann, welche Version aufgerufen werden soll. In diesem Fall müssen Sie explizit angeben, welches Sie aufrufen möchten, indem Sie das Argument in den entsprechenden Typ umwandeln.Beachten Sie, dass dieses Problem in der Praxis weitaus seltener auftritt, als man denkt. Der Grund dafür ist, dass dies nur passiert, wenn Sie explizit eine Methode mit
null
oder mit einer Variablen eines eher unspezifischen Typs (z. B.Object
) aufrufen .Im Gegenteil, der folgende Aufruf wäre völlig eindeutig:
Obwohl Sie den Wert immer noch übergeben
null
, weiß Java genau, welche Methode aufgerufen werden muss, da der Typ der Variablen berücksichtigt wird.quelle
Jedes Paar dieser drei Methoden ist für sich mehrdeutig, wenn es mit einem
null
Argument aufgerufen wird . Weil jeder Parametertyp ein Referenztyp ist.Im Folgenden finden Sie drei Möglichkeiten, eine bestimmte Methode von Ihnen mit null aufzurufen.
Darf ich vorschlagen, diese Mehrdeutigkeit zu beseitigen, wenn Sie tatsächlich vorhaben, diese Methoden mit
null
Argumenten aufzurufen . Ein solches Design führt in Zukunft zu Fehlern.quelle
Integer
-char[]
Paar ist mehrdeutig, da der Java-Compiler in zwei anderen Fällen die spezifischste Auswahl treffen kann, wie @JoachimSauer beschrieben.null
als Parameter aufzurufen . Unter dieser Voraussetzung sind alle drei Paare mehrdeutig. Für den allgemeinen Fall stimme ich zu, dass nur einInteger - char[]
Paar mehrdeutig ist.doSomething(null)
fürpublic static void doSomething(String str) { System.out.println("String called"); }
Dies gibt eine aufgerufene Zeichenfolge zurück.null
ist ein gültiger Wert für einen der drei Typen; Daher kann der Compiler nicht entscheiden, welche Funktion verwendet werden soll. Verwenden Sie so etwas wiedoSomething((Object)null)
oderdoSomething((Integer)null)
stattdessen.quelle
Jede Klasse in Java erweitert die Object-Klasse. Selbst die Integer-Klasse erweitert auch Object. Daher werden sowohl Object als auch Integer als Object-Instanz betrachtet. Wenn Sie also null als Parameter übergeben, wird der Compiler verwirrt, welche Objektmethode aufgerufen werden soll, dh mit dem Parameter Object oder dem Parameter Integer, da beide Objekte sind und ihre Referenz null sein kann. Die Grundelemente in Java erweitern Object jedoch nicht.
quelle
Ich habe dies versucht und wenn es genau ein Paar überladener Methoden gibt und eine davon einen Parametertyp Objekt hat, wählt der Compiler immer die Methode mit einem spezifischeren Typ aus. Wenn es jedoch mehr als einen bestimmten Typ gibt, gibt der Compiler einen mehrdeutigen Methodenfehler aus.
Da es sich um ein Ereignis zur Kompilierungszeit handelt, kann dies nur geschehen, wenn dieser Methode absichtlich null übergeben wird. Wenn dies absichtlich gemacht wird, ist es besser, diese Methode erneut ohne Parameter zu überladen oder eine andere Methode insgesamt zu erstellen.
quelle
Aufgrund von doSomething (char [] obj) und doSomething (Integer obj) besteht eine Mehrdeutigkeit.
char [] und Integer sind beide für null gleich überlegen, weshalb sie mehrdeutig sind.
quelle
Die Ausgabe heißt Int und heißt null. Die Mehrdeutigkeit besteht also aus char [] und Integer
quelle