2009-06-19 3 views
9

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

Почему?

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

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

ответ

20

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

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

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

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

+0

Я вижу. Спасибо. –

-1

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

+0

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

4

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

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

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

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

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

10

{} конструкция называется инициализатор массива, и он используется для инициализации массива в Java. (Ссылка: Section 10.6: Array Initializers от The Java Language Specification, Third Edition.)

Причина, по которой передача {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. 
0

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

Смежные вопросы