2012-07-03 9 views
8

Mam następujący kod, ale jestem mylić z wszystkich leków generycznych.Co jest statyczna <T> Lista <T> methodName (Lista <? super T> wejście)

public static <T> List<T> backwards (List<? super T> input) { 
     List<T> output = new ArrayList<T>(); 
     return output; 
} 

Moje zrozumienie jest, że mam metodę publiczną o nazwie backwards która tworzy ArrayList wykonawczych interfejs listy i powracający ArrayList. Moje pytanie brzmi, co faktycznie mówię do kompilatora z dalszej części ......

static <T> List<T> backwards (List<? super T> input) 
+2

'backwards' zajmuje na liście pewnego typu * *, gdzie * to * jest typ supertypem od' T' (na przykład wejście może być '' Lista ) i zwraca lista 'T'. – Mehrdad

+0

Dziękuję Mehrdadowi za wyjaśnienie tego. – user1459497

+0

Czy 'input' będzie używane w' tył'? Nie widziałem, gdzie to będzie używane. – Crazenezz

Odpowiedz

31

Mówisz do kompilatora:

<T> 

„Jestem deklarując dowolny typ T dla tej metody, która może być dowolna (nieprosta) dla każdego wywołania metody. "

List<T> 

„metoda zwróci List zawierające elementy tego typu T”.

List<? super T> input 

„metoda ta ma parametr zwany input, który jest List zawierający elementy typu T, lub super typu T. Na przykład, jeśli T jest Integer, input może być List<Integer>, List<Number> lub List<Object>. "

+0

Dziękuję Paul. Twoje wyjaśnienie jest bardzo jasne i szczegółowe. – user1459497

+5

Nie dotyczy to tego, co oznaczenie metody "public static List " oznacza w porównaniu do 'public static List '. – 2rs2ts

+2

@agarrett 'public static List ' nie deklaruje parametru typu, a więc musi już być w zakresie ogólnego typu parametru 'T' na deklarowanej klasie. Ale to pytanie nawet o tym nie wspomina, więc nie rozumiem, dlaczego to wychowałeś. –