如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或对象。因此,生成的字节码只包含普通的类,接口和方法。
但是,对于以下课程:
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?
答案 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> { }
而前者呢。