javap 和泛型的类型删除

标签 java generics type-erasure javap

我正在阅读 Herbert Schilds 关于 java 中泛型类型删除的文章。据说在类上运行 javap 应该会在类型删除后为我提供有关公共(public)、包保护和 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 的结果。

编辑:这似乎是 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>

关于javap 和泛型的类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43814619/

相关文章:

java - 在 JTable 中显示 JLabel

java - 关闭java应用程序时表单不会消失

java - 为什么 Java 中的数组不能进行类型删除?

java - 安卓 4.0 及更高版本 : Copy/paste/cut panel disappears onLongClick Listener on the EditText

c# - 我无法读取 foreach 循环中的 IEnumerable 项目

typescript - 接口(interface)泛型的类型推断

ios - Swift 泛型类、继承和协方差

java - 方法不适用于有关 Java 中泛型或类型删除的参数

scala - 如何在 Scala 中获取泛型函数的实际类型?

java - ArrayIndexOutOfBounds 抛出异常