2009-07-15 5 views
5

Ich habe Probleme zu verstehen, diese Frage und die Erklärung der Antwort für eine SCJP 1.6 Selbsttest Frage. Hier ist das Problem:Var-arg von Objekt-Arrays vs. Objekt-Array - versuchen, eine SCJP-Selbsttest-Frage zu verstehen

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 ist -434, aber was mich dazu bringt, ist die Erklärung des Buches. Es ist sehr verschieden davon, wie das Konzept früher in diesem Kapitel erläutert wurde.

„Im Allgemeinen überlastet var-args Methoden zuletzt ausgewählt werden. Beachten Sie, dass Arrays Objekte sind. Schließlich kann ein int auf eine ganze Zahl und dann verpackt werden,‚verbreiterten‘auf einen Gegenstand.“

Teilen Sie das auf, kann jemand bitte diese Erklärung weiter definieren?

  1. Im Allgemeinen werden überladene var-args-Methoden zuletzt gewählt.
  2. Arrays sind Objekte (ich bekomme das eigentlich, aber warum ist das relevant für diese Frage).
  3. Ein int kann in eine Ganzzahl eingerahmt und dann zu einem Objekt "erweitert" werden.

Vielen Dank!

Antwort

6

Das Buch versucht zu erklären, warum die ersten beiden Überladungen nie ausgewählt werden: weil der var-args Marker ... sie nur verwendet, wenn jede andere mögliche Überladung fehlschlägt. In diesem Fall passiert das nicht - die beiden Sätze, die mit "Remember" beginnen, erklären, WARUM es nicht passiert, warum andere mögliche Überladungen im ersten und letzten Fall existieren (der zweite Fall und seine Übereinstimmung mit der 3. Überladung) of sifter ist offensichtlich): Ein Array ist ein Objekt, und ein int kann boxened und dann zu einem Object erweitert werden, so dass die 4. Überladung den ersten und letzten der Aufrufe an sifter entspricht.

+0

Danke für die tolle Erklärung! –

+0

@ hal100001, immer glücklich zu helfen - sobald alle Antworten sind, denken Sie daran, wählen Sie die beste/am meisten-hilfreiche für die Annahme (wie Sie sagen, Msaeed ist auch sehr nützlich - wir sagen im Wesentlichen die gleichen Dinge natürlich , aber mein Ausdruck ist umgangssprachlicher, sein, strukturierter). –

4
  1. Wenn die Methode aufzurufen, der Compiler sucht zuerst zu der gleichen Klasse für Nicht Vararg Methode (zB sifter(Object)) vor der Prüfung eine Vararg ein (zB sifter(A[]...)), wenn beide der Methoden gehören versucht zu bestimmen (more oder weniger).

  2. Da ein Array ein Object ist, wird der Aufruf von sifter(aa)sifter(Object) übereinstimmen, damit nicht einmal sifter(A[]...) berücksichtigen.

  3. Ausgehend von Java 5, der Compiler "box" primitive, d.h. wandeln primitive Werte (z.B. int) können auf ihre Object (z.B. Integer) entspricht. Für sifter(6) konvertiert der Compiler die int 6 in eine Integer 6, so würde es die sifter(Object) Methode entsprechen.

+0

Ehrfürchtige Erklärung. Vielen Dank!!! –