стирание типа javap и дженериков

Я читаю Герберта Шилдса о стирании типов в дженериках в java. Предположительно запуск javap в классе должен дать мне информацию о байт-коде об общедоступных, защищенных и защищенных пакетами полях и методах после стирания типа. Однако я написал следующий класс:

    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);
}

Я что-то упустил здесь? Я должен добавить, что понимаю, что перегружать методы вышеописанным образом не рекомендуется. Мне просто было интересно увидеть результаты javap в этой двусмысленности.

EDIT: Это, кажется, результат нового исправления в javap. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651

Если я запускаю javap из JDK 1.6, я получаю ожидаемые результаты. Если я запускаю javap из JDK 1.7 b30, который я использовал изначально, я получаю результат с общей информацией.


person B M    schedule 09.04.2013    source источник


Ответы (1)


Я не уверен. Но кажется, что атрибут signature был введен в jvm 7 (см. спецификацию jvm).

Этот атрибут будет собирать информацию о подписи, используемую для отладки и отражения API.

Чтобы увидеть атрибут signature, используйте javap -v <class>

person Mitesh    schedule 09.01.2019