我正在阅读有关Java泛型中的类型擦除的Herbert Schilds。假设在类上运行javap应该会在类型擦除后为我提供有关public,包保护和 protected 字段和方法的字节码信息。但是,我编写了以下类(class):

    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的结果。

编辑:,这似乎是javap中新修复程序的结果。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651

如果我从JDK 1.6运行javap,则会得到预期的结果。如果我从最初使用的JDK 1.7 b30运行javap,我将得到带有通用信息的结果。

最佳答案

我不知道。但是似乎signature属性是在jvm 7 (refer jvm specification)中引入的。

此属性将捕获用于调试和反射api的签名信息。

要查看signature属性,请使用javap -v <class>

10-02 05:09