javap和泛型'类型擦除

我正在阅读Herbert Schilds关于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的结果感兴趣。

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

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


在编译时 - 在生成的字节码中,类会保留所有的通用类型信息。 你所看到的正是你应该期待的。

不同之处在于类型在运行时被擦除:例如,类Ambiguity<Integer, String>一个实例不会知道它的类型参数分别是IntegerString

链接地址: http://www.djcxy.com/p/12753.html

上一篇: javap and generics' type erasure

下一篇: Turn off file watching in Meteor