Java wird immer versuchen, die spezifischste anwendbare Version einer verfügbaren Methode zu verwenden (siehe JLS §15.12.2 ).
Object, char[]Und Integeralle nehmen kann nullals gültigen Wert. Daher sind alle 3 Versionen anwendbar, sodass Java die spezifischste finden muss.
Da Objectes sich um den Supertyp von handelt char[], ist die Array-Version spezifischer als die Object-Version. Wenn also nur diese beiden Methoden existieren, wird die char[]Version ausgewählt.
Wenn sowohl die char[]als auch die IntegerVersion verfügbar sind, sind beide spezifischer als, Objectaber 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 nulloder mit einer Variablen eines eher unspezifischen Typs (z. B. Object) aufrufen .
Im Gegenteil, der folgende Aufruf wäre völlig eindeutig:
char[] x = null;
doSomething(x);
Obwohl Sie den Wert immer noch übergeben null, weiß Java genau, welche Methode aufgerufen werden muss, da der Typ der Variablen berücksichtigt wird.
Integerzuint.