示例代码
前几天遇到这块的编译问题,查了一下,泛型这个东西,是可以擦除的...
代码如下:
public class myClass {
private static List<String> list;
public static void main(String[] args) {
list = new ArrayList<>();
list.add("abc");
// list.add(123);
try {
Method declaredMethod = list.getClass().getDeclaredMethod("add", Object.class);
declaredMethod.invoke(list, 123);
System.out.print(list);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
执行结果是:
[abc, 123]
为什么能擦除
Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。
Java的泛型是伪泛型,在设计之初,就是设计成了编译期间,所有的泛型信息都会被擦除掉。具体详细请参考Java不能实现真正泛型的原因?这篇文章,简单总结就是:
泛型是在JDK1.5出现时,当时JDK1.4已经在很多项目中使用,为了保证向前兼容,泛型不能像C语言那样,实现真正的泛型,所以做成了伪泛型。
其他相关扩展引用:
泛型的内部原理:类型擦除以及类型擦除带来的问题
Java 泛型,你了解类型擦除吗?