9

Вопрос по java, arrays, array-initialization, syntax – Почему передача {a, b, c} в метод не работает?

Я пытался передать список инициализации {...} конструктору, и это не сработало. Когда я вместо этого объявил это в локальной переменной метода (int []), это сработало безупречно.

Это почему?

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});
    }
}

Как оказалось, то, что стало особенностями языка varargs (как java.util.Arrays.asList), изначально собиралось сделать именно это. Вероятно, было ошибкой изменить его ...

от Tom Hawtin - tackline
7 ответов
4

Вы также можете сделать так:

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);
    }
}

Очень хорошо ! Я буду использовать это.

от Maxim Veksler
20

При объявлении

int[] и назначение{1, 2, 3} компилятор знает, что вы хотите создатьint[] как это прописано прямо там.

В последнем случае, когда вы вставляете массив непосредственно в вызов метода, вы должны будете использовать

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

сказать компилятору, какой у вас массив.

Понимаю. Спасибо.

от Maxim Veksler
4

Вероятно

это связано с тем, что в вашем списке инициализации нет информации о наборе. Попробуй это:

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

Вы пытались привести список к int [] перед передачей его конструктору?

Да, (int []) {1,2,3} не работает.

от Maxim Veksler
0

Фигурные скобки (при использовании в литералах массива) можно использо

вать только при объявлении массива :)

10

{} Конструкция называется инициализатором массива и используется для инициализации массива в Java. (Ссылка:Раздел 10.6: инициализаторы массива отСпецификация языка Java, третье издание.)

Причина прохождения{1, 2, 3} само по себе недопустимо, потому что нет никакой информации о типе, связанной с инициализатором.

Следовательно, нужно сообщить компилятору, что тип массива записываетсяnew Type[], гдеType тип, для которого создан массив.

Следующее является допустимым использованием инициализатора массива:

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

Как можно видеть, эта нотация может использоваться для многих типов данных, поэтому она не является специфичной для целых чисел.

Что касается:

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

Причина того, что вышеупомянутое допустимо, состоит в том, что информация о типе предоставляется компилятору в объявлении типа переменной, которое в этом случаеint[], Что из вышесказанного подразумевает следующее:

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

Теперь, если у нас естьnew int[] {1, 2, 3}мы можем создать новыйint[] массив на месте, так что может быть обработан как любой другойint[] массив - это просто то, что с ним не связано имя переменной.

Поэтому массив, созданныйnew int[] {1, 2, 3} может быть отправлен в метод или конструктор, который принимаетint[] в качестве аргумента:

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

В Java нет логического вывода типа. Объявления переменных массива явля

ютсяособый случай в спецификации языка Java тот, который не применяется к параметрам метода. Это было бы возможно, но добавило бы большую сложность в спецификацию, так как пришлось бы решать такие вопросы, как, например, {& quot; a & quot ;, & quot; b & quot;} создает String [] или Object [] - выглядит очевидным здесь, но что, если это объекты в иерархии сложного типа? А что если метод перегружен и обе версии существуют?

Похожие вопросы