2013-04-09 10 views
7

Czytam Herberta Schilda o typie wymazania w generycznych w java. Podobno uruchamianie javap na klasie powinno dać mi informacje o bajtach o publicznych, chronionych pakietowo i chronionych polach i metodach po wymazaniu typu. Jednak napisałem następujące klasy:Typ javap i rodzaj generatora

class Ambiguity<T, V extends String>{ 
    T ob1; 
    V ob2; 

    void set(T o){ 
     ob1 = o; 
    } 

    void set(V o){ 
     ob2 = o; 
    } 
} 

i pobiegł javap plik klasy, który został wygenerowany i mam następujący wynik

zestawionych z "Test.java"

class Ambiguity<T, V extends java.lang.String> { 
    T ob1; 
    V ob2; 
    Ambiguity(); 
    void set(T); 
    void set(V); 
} 

byłem oczekiwanie wyniku, który wyglądałby tak w oparciu o to, co przeczytałem.

Compiled from "Test.java" 
class Ambiguity<java.lang.Object, java.lang.String> { 
    java.lang.Object ob1; 
    java.lang.String ob2; 
    Ambiguity(); 
    void set(java.lang.Object); 
    void set(java.lang.String); 
} 

Czy brakuje mi tutaj czegoś? Dodam, że rozumiem, że nie jest dobrą praktyką przeciążanie metod w powyższy sposób. Właśnie zobaczyłem, że interesują mnie wyniki javap pod tą niejednoznacznością.

EDIT: Wydaje się, że jest to wynikiem nowej poprawki w javap. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651

Jeśli uruchomię javap z JDK 1.6, otrzymam wyniki zgodnie z oczekiwaniami. Jeśli uruchomię javap z JDK 1.7 b30, z którego początkowo korzystałem, otrzymuję wynik z ogólnymi informacjami.

Odpowiedz

3

Przy - czas kompilacji - w wygenerowanym kodzie bajtowym - klasy będą, tak, zachowywać wszystkie swoje ogólne informacje o typie. To, co zobaczyłeś, jest dokładnie tym, czego powinieneś się spodziewać.

Różnica polega na tym, że typy są usuwane w wykonywania: na przykład instancja klasy Ambiguity<Integer, String> nie będzie wiedział, że jej argumenty są typu Integer i String odpowiednio.

+0

Dzięki za odpowiedź. Oto, co mówi Schilds: "Po skompilowaniu kodu Java wszystkie informacje ogólne są usuwane (usuwane)". Pokazuje wyniki działania javap, podobnie jak poprzedni. –

+0

Następnie Schilds się myli. Typ wymazania jest zjawiskiem uruchomieniowym i istnieje wiele narzędzi, które wykorzystują fakt, że klasy zachowują ogólne informacje o typie; to tylko _instancje_, które tracą te metadane. –

+0

Kolejne pytanie na SO, mówi również to samo: http://stackoverflow.com/questions/11966091/displaying-generic-type-parameters-from-compiled-class-files –