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