Var-Arg von Objektarrays gegen Objektarray-Versuch, eine SCJP-Selbsttestfrage zu verstehen
-
13-09-2019 - |
Frage
Ich habe Probleme, diese Frage und die Erklärung der Antwort für eine SCJP 1.6 -Selbsttestfrage zu verstehen. Hier ist das Problem:
class A { }
class B extends A { }
public class ComingThru {
static String s = "-";
public static void main(String[] args) {
A[] aa = new A[2];
B[] ba = new B[2];
sifter(aa);
sifter(ba);
sifter(7);
System.out.println(s);
}
static void sifter(A[]... a2) { s += "1"; }
static void sifter(B[]... b1) { s += "2"; }
static void sifter(B[] b1) { s += "3"; }
static void sifter(Object o) { s += "4"; }
}
Was ist das Ergebnis? Die Antwort lautet -434, aber was mich abschreckt, ist die Erklärung des Buches. Es unterscheidet sich stark von der Erklärung des Konzepts in diesem Kapitel.
"Im Allgemeinen werden überlastete Var-Args-Methoden zuletzt ausgewählt. Denken Sie daran, dass Arrays Objekte sind. Schließlich kann ein INT an eine Ganzzahl gebeugt und dann" erweitert "zu einem Objekt."
Kann jemand diese Erklärung bitte weiter definieren?
- Im Allgemeinen werden überlastete Var-Args-Methoden zuletzt ausgewählt.
- Arrays sind Objekte (ich verstehe das, aber warum ist das für diese Frage relevant).
- Ein INT kann an eine Ganzzahl gepoppt werden und dann in ein Objekt "erweitert" werden.
Vielen Dank!
Lösung
Das Buch versucht zu erklären, warum die ersten beiden Überladungen niemals ausgewählt werden: weil der Var-Args-Marker ...
führt zu nur, wenn jede andere Überladung fehlschlägt. In diesem Fall passiert dies nicht - die beiden Sätze, die mit "Remember" beginnen von Sifter ist offensichtlich): Ein Array ist ein Objekt, und ein INT kann dann auf ein Objekt verbreitert werden, sodass die 4. Überladung mit den ersten und letzten Anrufen an Sifter übereinstimmt.
Andere Tipps
Beim Versuch, zu bestimmen, welche Methode aufgerufen werden soll, sucht der Compiler zuerst nach Nicht -Vararg -Methode (z. B.
sifter(Object)
) bevor Sie einen Vararg in Betracht ziehen (z. B. zBsifter(A[]...)
), wenn beide Methoden zur gleichen Klasse gehören (mehr oder weniger).Da ist ein Array ein
Object
, die Aufruf vonsifter(aa)
wird passensifter(Object)
, daher nicht einmal in Betracht ziehensifter(A[]...)
.Ausgehend von Java 5, dem Compiler May "Box" Primitive, dh primitive Werte konvertieren (z. B.
int
) zu ihrer entsprechendenObject
(z.BInteger
). So fürsifter(6)
, der Compiler konvertiert dieint 6
In einInteger 6
, so würde es mit dem übereinstimmensifter(Object)
Methode.