为什么这个类型参数保留在字节码中?

时间:2014-11-05 22:02:18

标签: java generics

type erasure page

  

如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或对象。因此,生成的字节码只包含普通的类,接口和方法。

但是,对于以下课程:

public class Foo<E extends CharSequence> {
    public E something;
}

javap -c Foo打印:

public class Foo<E extends java.lang.CharSequence> {
  public E something;
}

为什么type参数不会被绑定(CharSequence)替换,而是保存为E?

3 个答案:

答案 0 :(得分:7)

您打印的内容不是字节码。这是方法签名。它放在那里,以便编译器在编译调用它的其他类时可以强制执行类型安全。

答案 1 :(得分:3)

类型信息保留在类和方法上,但不保留在实际变量上。如果你写了

class Foo extends Bar<String> {
}

...您可以在运行时提取Bar<String>,但如果您有

new Bar<String>();

...你可以在那里提取Bar<String>

答案 2 :(得分:0)

保留type参数,因为必须知道它才能进行子类化。 定义

public class Foo<E extends CharSequence> 

public class Foo<CharSequence> 

不相等,因为后者不允许将子类声明为:

public class MyStringFoo extends Foo<String> { }

而前者呢。