2013-07-12 11 views
5

na przykład mam kod jak poniżej: (from here)Co oznaczają 3 kropki w generycznych 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) { 
     } 
} 

i co się 3 kropki w parametrze metody zrobienia?

+1

numer Niezdefiniowany argumentów typu ciąg? –

+2

Należy zauważyć, że varargs (zmienne argumenty arii) nie mają nic wspólnego z rodzajami. –

+0

Zobacz także [artykuł wikipedia o funkcjach variadycznych] (http://en.wikipedia.org/wiki/Variadic_function) –

Odpowiedz

8

trzema kropkami są nazywane varargs i tutaj, pozwala przekazać więcej niż jeden łańcuch metody tak:

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

Documentation on that here.

W metodzie doInBackground można wyliczyć nad varargs zmienną params tak:

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

więc jego w zasadzie macierzy S podstępy w zakresie doInBackground

+0

ok. i jak mam uzyskać dostęp do tych ciągów? tak jak tablica? – maysi

+2

@ Simon Yup. W rzeczywistości w czasie wykonywania jest to tylko tablica, a nawet specjalna. Komponenty "..." to wyłącznie syntaktyczny cukier w czasie kompilacji. Możesz nawet wywołać metodę, przekazując mu 'String []' (lub cokolwiek innego) zamiast pęczka 'String's, jak pokazuje ta odpowiedź. – yshavit

3

Kompilator traktuje trzy kropki ... jako przyjmujące tablicę tego obiektu. W tym przypadku String i Void. Ilość obiektów, które przekazujesz, jest wielkością tablicy.

Zatem:

doInBackground("Hi", "Hello", "Bye") utworzy tablicę String długości 3.

+0

, więc void wygeneruje tablicę typu Object? – maysi

+1

@Simon nie 'void' to jest' Void' to jest sam obiekt inny niż 'void' twoje myślenie o – chancea

+0

Okay i parametry takie jak 'Void ... objects' będą takie same jak' Object [] objects'? – maysi

2

Koncepcja ta jest wywoływana varargs i wyjaśnione here