集合泛型的本质
Java集合中的泛型是为了防止错误输入的,只在编译阶段有效。绕过编译阶段就无效了。
验证泛型只在编译阶段有效
通过方法的反射操作,可以绕过编译。
public class MethodDemo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
ArrayList<String> list1 = new ArrayList<>();
list1.add("hello");
// list1.add(20);
Class c1 = list.getClass();
Class c2 = list1.getClass();
System.out.println(c1==c2);//反射的操作都是在编译之后的操作
/**
* c1==c2结果返回true,说明编译之后集合的泛型是去泛型化的
* Java中集合的泛型,是防止错误输入的,只在编译阶段有效
* 绕过编译阶段就无效了
* 如何验证:
* 通过方法的反射来操作,绕过编译
*/
try {
Method m = c2.getMethod("add",Object.class);
m.invoke(list1,100);//绕过编译就绕过了泛型
System.out.println(list1.size());
System.out.println(list1);
//不能遍历,否则会报类造型异常
// for (String str: list1) {
// System.out.println(str);
// }
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
上述实例中c1==c2结果返回true,说明编译之后集合的泛型是去泛型化的
,也就是说明泛型只存在编译阶段。