2013-07-12 2 views
5

, например, у меня есть такой код: (from here)Что означают три точки в Java-дженериках?

private class LongOperation extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) {}  

     @Override 
     protected void onPostExecute(String result) {} 

     @Override 
     protected void onPreExecute() {} 

     @Override 
     protected void onProgressUpdate(Void... values) { 
     } 
} 

и что эти 3 точки в параметре метода делать?

+1

Не определено количество аргументов типа строки? –

+2

Обратите внимание, что varargs (аргументы переменной arity) не имеют ничего общего с дженериками. –

+0

См. Также [статья википедии о вариационных функциях] (http://en.wikipedia.org/wiki/Variadic_function) –

ответ

8

три точки называются varargs и здесь, позволяют передавать более одной строки метода следующим образом:

doInBackground("hello","world"); 
//you can also do this: 
doInBackground(new String[]{"hello","world"}); 

Documentation on that here.

В методе doInBackground вы можете перечислить над переменной длины переменной, params так:

for(int i=0;i<params.length;i++){ 
    System.out.println(params[i]); 
} 

таким образом, ее в основном массивом с в пределах doInBackground

+0

ОК. и как мне получить доступ к этим строкам? как массив? – maysi

+2

@Simon Yup. Фактически, во время выполнения это _is_ просто массив, и даже не специальный. Материал '...' является чисто синтаксическим сахаром. Вы можете даже вызывать метод, передавая ему 'String []' (или что-то еще) вместо связки 'String', как показывает этот ответ. – yshavit

3

Компилятор обрабатывает три точки ... как взятие в массиве этого объекта. В этом случае String и Void. Количество объектов, которые вы передаете, - это размер массива.

Таким образом:

doInBackground("Hi", "Hello", "Bye") создаст массив String длины 3.

+0

, поэтому void будет генерировать массив типа Object? – maysi

+1

@Simon не 'void' это' Void', это сам объект, отличный от того, что 'void' ваше мышление – chancea

+0

Хорошо, и параметры типа' Void ... objects' будут такими же, как 'Object [] objects'? – maysi

2

Эта концепция называется и переменные аргументы объяснена here

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