Methode Überladen für Null-Argument

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 doSomething(null) aufruft, doSomething(null) Compiler einen Fehler als mehrdeutige Methode aus . So ist das Problem, weil Integer und char[] Methoden oder Integer und Object Methoden?

Java wird immer versuchen, die spezifischste verfügbare Version einer verfügbaren Methode zu verwenden (siehe JLS §15.12.2 ).

Object , char[] und Integer können null als gültigen Wert annehmen. Daher sind alle 3 Versionen anwendbar, also muss Java das spezifischste finden.

Da Object der Super-Typ von char[] , ist die Array-Version spezifischer als die Object Version. Wenn also nur diese beiden Methoden existieren, wird die Version char[] gewählt.

Wenn sowohl die char[] als auch die Integer Versionen verfügbar sind, sind beide spezifischer als Object aber keiner ist spezifischer als der andere, so dass Java nicht entscheiden kann, welchen zu nennen ist. In diesem Fall müssen Sie explizit angeben, welche Sie aufrufen möchten, indem Sie das Argument auf den entsprechenden Typ anwenden.

Beachten Sie, dass dieses Problem in der Praxis viel seltener auftritt, als man vielleicht denkt. Der Grund dafür ist, dass es nur auftritt, wenn Sie explizit eine Methode mit null oder mit einer Variable eines nicht spezifischen Typs (z. B. Object ) aufrufen.

Im Gegenteil, die folgende Invokation wäre vollkommen eindeutig:

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

Obwohl Sie immer noch den Wert null , weiß Java genau, welche Methode aufgerufen werden soll, da der Typ der Variablen berücksichtigt wird.

Jedes Paar dieser drei Methoden ist mehrdeutig, wenn es mit einem null Argument aufgerufen wird. Weil jeder Parametertyp ein Referenztyp ist.

Im Folgenden finden Sie die drei Möglichkeiten, eine bestimmte Methode mit null aufzurufen.

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

Darf ich vorschlagen, diese Mehrdeutigkeit zu entfernen, wenn Sie tatsächlich planen, diese Methoden mit null aufzurufen. Solch ein Design lädt in der Zukunft zu Fehlern ein.

null ist ein gültiger Wert für jeden der drei Typen. Der Compiler kann also nicht entscheiden, welche function er verwenden soll. Verwenden Sie stattdessen etwas wie doSomething((Object)null) oder doSomething((Integer)null) .

Jede class in Java erweitert die Object-class. Die Even Integer-class erweitert auch Object. Daher werden sowohl Object als auch Integer als Objektinstanz betrachtet. Wenn Sie also null als Parameter übergeben, wird der Compiler verwirrt, welche Objektmethode aufgerufen werden soll, dh mit Parameter Object oder Parameter Integer, da beide Objekte sind und ihre Referenz null sein kann. Aber die Primitive in Java erweitern das Objekt nicht.

Ich habe dies versucht, und wenn es genau ein Paar überladener Methode gibt und eine von ihnen einen Parametertyp Object hat, wird der Compiler immer die Methode mit einem spezifischeren Typ auswählen. Wenn es jedoch mehr als einen bestimmten Typ gibt, triggers der Compiler einen mehrdeutigen Methodenerrors aus.

Da dies ein Kompilierzeit-Ereignis ist, kann dies nur geschehen, wenn man absichtlich null an diese Methode übergibt. Wenn dies absichtlich gemacht wird, ist es besser, diese Methode erneut ohne Parameter zu überladen oder eine andere Methode zu erstellen.

Es gibt eine Mehrdeutigkeit wegen doSomething (char [] obj) und doSomething (Integer obj).

char [] und Integer sind beide für null gleich überlegen, weshalb sie mehrdeutig sind.

 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); } } 

Die Ausgabe ist Int, die Null genannt wird, und so ist Mehrdeutigkeit mit char [] und Integer