java为什么泛型类型信息在类文件中可见?
根据https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html
编译器应将每个无边界类型替换为Object
我有一门课:
public class Test<E> {
void setE(E e) {
return;
}
}
在Idea中反编译后,结果如下:
public class Test<E> {
public Test() {
}
void setE(E e) {
}
}
为什么E
没有被Object
取代
# 1 楼答案
本教程在这里有些误导。它试图强调类型擦除,但它做得并不优雅
生成的类的字节码如下所示。显然,这些信息并没有被丢弃
这些信息不能在字节码中丢弃的原因是,假设这个类是库的一部分;另一个项目取决于它。在第二个项目的编译时,他们的编译器需要能够断言泛型类型参数是否在边界内。如果它被完全扔掉了,他们就得写信了
而在我的源项目中,我可以写