2009-06-29 13 views

Odpowiedz

14

Jest to użycie leków generycznych. Sprawdź to intro. A następnie nie zapomnij przeczytać tego tutorial.

Fragment następująco (która porównuje zastosowanie obsady kontra stosowania leków generycznych):

Gdy pojawi się kod < Tekst>, przeczytaj ją jako „typu”; deklaracja powyżej brzmi "Kolekcja ciągu c." Kod używający generycznych jest bardziej przejrzysty, a bezpieczniejszy. Usunęliśmy niebezpieczne rzuty i kilka dodatkowych nawiasów . Co ważniejsze, mamy przeniósł część opisu sposobu z komentarzem do jego podpisu , więc kompilator może sprawdzić w czasie kompilacji, że typ ograniczenia nie są łamane w okresie czasie. Ponieważ program kompiluje bez ostrzeżeń, możemy stwierdzić z pewnością, że nie wyrzuci wyjątku ClassCastException w czasie wykonywania. Efekt sieciowy z użyciem generycznych, , w szczególności w dużych programach, to poprawiona czytelność i niezawodność.

Na przykład, interfejs z listy jest

public interface List<E> { 
    void add(E x); 
    Iterator<E> iterator(); 
} 

Oznacza to, że można zbudować listę, której zawartość jest wszystkim tym samym wyraźną typu (nie tylko od typu obiektu), nawet jeśli masz sam zdefiniował typ. Tak więc, jeśli utworzyć klasę nazwisko można napisać

List<Name> nameList = new List<Name>(); 

a następnie napełnić go przypadkach nazwiska i bezpośrednio pobierać instancji nazwę od niej, bez konieczności odlewane lub w inny sposób o to martwić, ponieważ zawsze otrzymasz albo nazwą instancja lub null z powrotem, nigdy instancja innego typu.

Co ważniejsze, nie można wstawić niczego innego niż instancja Name w takiej liście, ponieważ nie powiedzie się ona podczas kompilacji.

nameList.add(false); //Fails! 
nameList.add(new Name("John","Smith")); //Succeeds supposing Name has a 
             //firstName, lastName constructor 
+0

Przeczytałem 'List ' jako "List of Types" tak, jakby T jest skrótem od Type. Zauważyłem '' w wielu kodach. Czy jest to skrót od czegokolwiek? Czy powinienem po prostu przeczytać to jako "Collection of Es" – Aust

16

Oznacza to, że mamy do czynienia z kolekcją przedmiotów o typie E. Wyobraź sobie, że masz filiżankę herbaty. Zamiast herbaty, to może również posiadać kawę więc ma to sens, aby opisać ten kielich jako ogólny jednostki:

class Cup<T> { … } 

teraz można ją wypełnić, albo z kawy lub herbaty (lub coś innego):

Cup<Tea> cuppa = new Cup<Tea>(); 
Cup<Coffee> foamee = new Cup<Coffee>(); 

Aby to zadziałało, zarówno Tea, jak i Coffee musiałyby być typami zdefiniowanymi w programie.

To jest ograniczenie czasu kompilacji na swoim kodzie.Wracając z przykładu (raczej bezużytecznego), kolekcje (tablice, listy ...) zwykle zawierają elementy typu , np., np. liczby całkowite lub ciągi. Generics pomoże ci wyrazić to w Javie:

Collection<String> strList = new ArrayList<String>(); 
strList.add("Foobar"); // Works. 
strList.add(42);  // Compile error! 

Zauważ powyżej błąd kompilacji? Dostajesz to tylko wtedy, gdy używasz generycznych. Poniższy kod również działa, ale nie dałby miła wiadomość o błędzie:

Collection strList = new ArrayList(); 
strList.add("Foobar"); // Works. 
strList.add(42);  // Works now. Do we really want this?! 
+0

dobre wyjaśnienie :) – Johanna

+2

Dotyk mylące jako Puchar klasy byłby faktycznie wymawiane Puchar T :) – johnc

+1

@lagerdalek: że nie uniknął w ogóle mojej uwagi. ;-) W rzeczywistości wyjaśnienie to zostało zainspirowane: http://www.zazzle.com/c_cup_of_t_mug-168503670567870702 –