类型擦除页说
如果类型参数是无界的,则用它们的界限或对象替换泛型类型中的所有类型参数。因此,生成的字节码只包含普通类、接口和方法。
然而,对于以下课程:
public class Foo<E extends CharSequence> {
public E something;
}
javap -c Foo
打印:
public class Foo<E extends java.lang.CharSequence> {
public E something;
}
为什么类型参数没有被绑定(CharSequence)替换,而是保留为E?
发布于 2014-11-05 22:30:38
你打印的不是字节码。这是方法签名。它放在那里,这样编译器就可以在编译其他调用它的类时执行类型安全性。
发布于 2014-11-05 22:30:47
类型信息保留在类和方法上,而不是在实际字段上。如果你写
class Foo extends Bar<String> {
}
...you可以在运行时提取Bar<String>
,但如果您有
new Bar<String>();
...you不能在此提取Bar<String>
。
发布于 2022-07-09 10:27:13
我同意@ answer 207421的答案。可以通过尝试以下代码来区分原始类型和完整泛型类型:
public class App {
public static void main(String args[]) {
Foo raw = new Foo(Something);
}
}
当您检查这个类的字节码时,您会发现缺少E
。所以这是一种原始类型。这些原始类型没有限制,甚至可能需要转换,因此可能引发异常。这就是为什么使用泛型;以确保类型安全。这是一个完整的源代码机制。
https://stackoverflow.com/questions/26767992
复制相似问题