Frage

Ich habe versucht, eine Initialisierungsliste passieren {...} zu einem Konstruktor und es hat nicht funktioniert. Als ich es stattdessen in einer Methode lokale Variable deklariert (int []) ist es einwandfrei funktioniert.

Warum?

public class QuickSort {
    int[] a;

    public QuickSort(int[] a) {
        this.a = a;
    }

    public static void main(String[] args) {
        // ###################
        // ###    WORKS     ##
        // ###################
        int[] a = {8,12,79,12,50,44,8,0,7,289,1};
        QuickSort sort = new QuickSort(a);

        // ###################
        // ### DOESN'T WORK ##
        // ###################
        //QuickSort sort = new QuickSort({8,12,79,12,50,44,8,0,7,289,1});
    }
}
War es hilfreich?

Lösung

Wenn Sie eine int[] deklarieren und zuweisen {1, 2, 3} der Compiler weiß, Sie wollen eine int[] erstellen, wie es genau dort geschrieben ist aus.

Im letzteren Fall, in dem Sie das Array direkt in das Verfahren Stick rufen Sie würden verwenden müssen

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});

, um den Compiler zu sagen, was Ihr Array ist.

Andere Tipps

Das {} Konstrukt wird eine Feldinitialisierung genannt, und es verwendet, um ein Array in Java zu initialisieren. (Referenz: Abschnitt 10.6: Array Initializers aus Die Java Language Specification, Third Edition .)

Der Grund, warum vorbei {1, 2, 3} selbst nicht gültig ist, weil es keine Informationen über den Typ der initializer zugeordnet ist.

Deshalb muss man der Compiler den Typ des Arrays wissen lassen, indem er new Type[] ist, wo die Type der Typ ist, für die das Array für hergestellt wird.

Im Folgenden werden alle gültigen Verwendung des Feldinitialisierung:

  • new String[] {"Hello, "World"}
  • new Character[] {'A', 'B'}
  • new Runnable[] {new Runnable() {public void run() {}}, new Runnable() {public void run() {}}

Wie man sehen kann, kann diese Notation für viele Datentypen verwendet werden, so ist es nicht etwas, das für ganze Zahlen spezifisch ist.

Wie für:

int[] a = {1, 2, 3};

Der Grund, warum die oben gültig ist, weil die Typinformationen für den Compiler in der Variablentypdeklaration vorgesehen sind, der in diesem Fall int[] ist. Was die oben wird impliziert, ist die folgende:

int[] a = new int[] {1, 2, 3};

Wenn wir nun new int[] {1, 2, 3} haben, wir sind in der Lage ein neues int[] Array an seinem Platz zu schaffen, so dass wie jeder anderen int[] Array behandelt werden würde - es ist nur, dass es nicht einen Variablennamen mit ihm verbunden.

Daher wird das Array von new int[] {1, 2, 3} erstellt wird, kann in ein Verfahren oder Konstruktor gesendet werden, die ein int[] als Argument:

new Quicksort(new int[] {1, 2, 3});  // This will work.

Dies ist wahrscheinlich, weil Ihre Initialisierungsliste keine Eingabe Informationen zu ihm hat. Versuchen Sie folgendes:

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});

Sie können auch wie folgt tun:

public class QuickSort {
    int[] a;

    public QuickSort(int ... a) {
        this.a = a;
    }

    public static void main(String[] args) {

        QuickSort sort = new QuickSort(8,12,79,12,50,44,8,0,7,289,1);
    }
}

Java nicht wirklich Typinferenz haben. Array Variablendeklarationen sind ein Sonderfall in die Java-Sprachspezifikation, eine, die Verfahrensparameter keine Anwendung findet. so wäre es möglich machen, würde aber viel Komplexität der Spezifikation hinzuzufügen, da es Fragen behandeln müssen würde wie, ob { „a“, „b“} erzeugt ein String [] oder Object [] - hier offensichtlich sieht, aber was, wenn es Objekte in einer komplexen Typ Hierarchie ist? Und was, wenn das Verfahren überlastet ist und beide Versionen gibt es?

geschweiften Klammern (wenn in Array-Literalen) dürfen nur verwendet werden, wenn das Array deklarieren:)

Haben Sie versucht, die Liste casting [] int, bevor es an den Konstruktor übergeben?

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