Я читаю Herbert Schilds о стирании стилей в дженериках в java. Предположительно, запуск javap в классе должен дать мне информацию о байт-кодах об открытых, защищенных и защищенных пакетах и методах после стирания стилей. Тем не менее, я написал следующий класс:стирание типа javap и generics
class Ambiguity<T, V extends String>{
T ob1;
V ob2;
void set(T o){
ob1 = o;
}
void set(V o){
ob2 = o;
}
}
и побежал javap на файл класса, который был создан и получил следующий вывод
Составлено из «Test.java»
class Ambiguity<T, V extends java.lang.String> {
T ob1;
V ob2;
Ambiguity();
void set(T);
void set(V);
}
Я ожидая выхода, который выглядел так, основываясь на том, что я читал.
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);
}
Я что-то пропустил? Я должен добавить, что я понимаю, что не рекомендуется перегружать методы описанным выше способом. Я просто наблюдал за тем, чтобы увидеть результаты джавапа под этой двусмысленностью.
EDIT: Это, кажется, результат нового исправления в javap. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651
Если я запускаю javap из JDK 1.6, я получаю результаты, как и ожидал. Если я запускаю javap из JDK 1.7 b30, который был тем, что я использовал, я получаю результат с общей информацией.
Спасибо за ответ. Вот что говорит Шильдс: «Когда ваш Java-код скомпилирован, вся информация об общем типе удаляется (удаляется)». Он показывает результаты запуска javap, как и предыдущий. –
Тогда Шильдс ошибается. Стирание типа - это явление времени выполнения, и есть много утилит, которые используют преимущества того, что классы сохраняют информацию об их родовом типе; это просто _instances_, которые теряют эти метаданные. –
Еще один вопрос о SO, также говорит то же самое: http://stackoverflow.com/questions/11966091/displaying-generic-type-parameters-from-compiled-class-files –