2008-12-10 22 views
10

Na przykład, można napisać jednego z nich:W języku Java, kiedy należy używać "Object o" zamiast generycznych?

class example <T> 
{ 
    ... 

    public void insert (T data) 
    { 
     ... 
    } 
} 

lub

class example 
{ 
    ... 

    public void insert (Object o) 
    { 
     ... 
    } 
} 

Czy istnieje signficant różnica pomiędzy 2 pod względem wydajności? W przypadku generycznych mogłem ograniczyć typ parametru i przy drugim podejściu nie byłoby konieczne zdefiniowanie typu obiektu podczas jego tworzenia.

Również z drugim podejściem mogłem w zasadzie wstawić cokolwiek do klasy, prawda? Podczas gdy w przypadku leków generycznych każdy element w klasie byłby tego samego rodzaju.

Coś jeszcze brakuje?

Odpowiedz

9

Jedyny powód, aby napisać tę drugą, jest jeśli musisz kierować wcześniejszą maszynę JVM. Generics są implementowane przez usuwanie typu, więc nie mają wpływu na środowisko wykonawcze - dodano jedynie kontrolę czasu kompilacji, która poprawi twój kod.

Oczywiście, jeśli potrzebujesz kolekcji, która zawiera jakiś stary obiekt lub mieszankę kilku, które nie mają wspólnej nadklasy, potrzebujesz zwykłej odmiany obiektu (ale wtedy twoja klasa może nadal być ogólna i tworzyć instancję z nowymi ... <Obiekt>).

6

Wydaje mi się, że to już prawie wszystko. Nie ma różnicy w wydajności. Generics są zracjonalizowane (Type Erasure) po skompilowaniu kodu i nie istnieją już w środowisku wykonawczym. Dodają po prostu rzuty, gdy są potrzebne, i sprawdzają, jak to określiłeś. Neal Gafter napisał ładny przegląd tego, jak działają, o bieżących problemach z Generics i o tym, jak można je rozwiązać w następnej wersji Java: http://gafter.blogspot.com/2006/11/reified-generics-for-java.html

3

Nie powinna występować różnica w wydajności.

Jednak Java nie oferuje wariancji parametrów, więc są sytuacje, w których będziesz nadpisywać funkcje pre-generics, takie jak equals, compareTo, itp., Gdzie będziesz musiał używać obiektów.

+0

Yeap. To byłby jedyny powód. Jeśli chcesz wymieszać różne typy danych, to generics nie zrobi tego. Na przykład mieszanie ... mmhh ... Struny i pracownicy w tym samym miejscu (dlaczego to robisz, nie wiem) – OscarRyz

0

Niektóre z spotkań, w których musiałem użyć "Obiektu" zamiast "Rodzajów", dotyczyły przymusu niż wyboru. Podczas pracy z pre-generic kodu lub bibliotek zbudowanych wokół pre-generic api, nie ma wielkiego wyboru. Dynamiczne proxy na przykład Proxy.newProxy() zwraca Typ obiektu. Przekazywanie ogólnego kontekstu (gdzie kontekst może być cokolwiek) jest kolejną instancją. Niektórzy z moich przyjaciół twierdzą, że są tak dobrzy, jak nie-generics. Jeśli chodzi o wydajność, nie powinno być żadnych kosztów ogólnych, biorąc pod uwagę wymazanie typu.

0

Jeśli chodzi o wydajność, zgadzam się z powyższymi osobami.

Odnośnie tego punktu twoje

„Ponadto, przy drugim podejściu Mógłbym w zasadzie wkładać niczego do klasy, prawda? Podczas gdy z rodzajowych każdy element w klasie byłoby tego samego typu.”

Kolejną zaletą generycznych jest sprawdzenie typu przydziału samej instancji przykładowej.

Powiedzmy, że na przykład miałeś przykład e1, a inny przykład e2 bezpieczeństwa typu byłby zachowany i nigdy nie byłbyś w stanie wykonać e1 = e2;

przy użyciu przykładu obiektu, który byłby możliwy.

Powiązane problemy