Javap 和泛型的类型擦除



我正在阅读Herbert Schilds关于java中泛型中的类型擦除的文章。假定在类上运行javap应该在类型擦除之后为我提供有关public、package protected和protected字段和方法的字节码信息。但是,我编写了以下类:

    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

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

我不确定。但是signature属性似乎是在jvm 7中引入的(参考jvm规范)。

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

使用javap -v <class>

查看signature属性

相关内容

  • 没有找到相关文章

最新更新