Var-Arg von Objektarrays gegen Objektarray-Versuch, eine SCJP-Selbsttestfrage zu verstehen

StackOverflow https://stackoverflow.com/questions/1129282

  •  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?

  1. Im Allgemeinen werden überlastete Var-Args-Methoden zuletzt ausgewählt.
  2. Arrays sind Objekte (ich verstehe das, aber warum ist das für diese Frage relevant).
  3. Ein INT kann an eine Ganzzahl gepoppt werden und dann in ein Objekt "erweitert" werden.

Vielen Dank!

War es hilfreich?

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

  1. 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. zB sifter(A[]...)), wenn beide Methoden zur gleichen Klasse gehören (mehr oder weniger).

  2. Da ist ein Array ein Object, die Aufruf von sifter(aa) wird passen sifter(Object), daher nicht einmal in Betracht ziehen sifter(A[]...).

  3. Ausgehend von Java 5, dem Compiler May "Box" Primitive, dh primitive Werte konvertieren (z. B. int) zu ihrer entsprechenden Object (z.B Integer). So für sifter(6), der Compiler konvertiert die int 6 In ein Integer 6, so würde es mit dem übereinstimmen sifter(Object) Methode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top