Почему передача {a, b, c} в метод не работает? - PullRequest
9 голосов
/ 19 июня 2009

Я пытался передать список инициализации {...} конструктору, но он не сработал. Когда я вместо этого объявил это в локальной переменной метода (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});
    }
}

Ответы [ 7 ]

20 голосов
/ 19 июня 2009

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

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

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

, чтобы сообщить компилятору, какой у вас массив.

10 голосов
/ 19 июня 2009

Конструкция {} называется инициализатором массива и используется для инициализации массива в 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.
4 голосов
/ 19 июня 2009

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

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);
    }
}
4 голосов
/ 19 июня 2009

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

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});
2 голосов
/ 19 июня 2009

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

0 голосов
/ 19 июня 2009

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

0 голосов
/ 19 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...