在java的泛型中,实际上只是编译器认识泛型,而虚拟机是不认识泛型的。简单来讲,在运行时,所有的泛型都是object
泛型检查存在擦除泛型的动作(即编译器认识泛型,而虚拟机不认识泛型),真正运行时,泛型位置仍然使用的是object
//指定list的泛型为Integer
ArrayList<Integer> list = new ArrayList<>();
//Integer类型的数据可以正常添加
list.add(1);
//如果添加String类型的数据,则编译器报错,无法通过编译
//list.add("a");
//通过反射绕过泛型检查,即泛型擦除
Class<ArrayList> listClass = ArrayList.class;
Method addMethod = listClass.getMethod("add", Object.class);
//编译器不再报错,程序也可以正常执行
addMethod.invoke(list, "a");