这篇文章主要通过Class的Method来了解泛型的本质。
先new 两个List,一个不加类型限制,另外一个限制类型为String:
ArrayList list = new ArrayList(); ArrayList<String> list1 = new ArrayList<String>();
根据我们的编程经验可以知道,list1.add("hello"),这是没有问题的,而list1.add(20),这是错误的,因为泛型限制了数据类型,这时候我们可以来看看list和list1的类类型,看看他们是否一致:
Class c1 = list.getClass();
Class c2 = list1.getClass();
System.out.println(c1 == c2);
可以得到结果为true,即c1=c2,我们知道,反射的操作是编译之后的操作,这说明编译之后集合的泛型是去泛型化的,由此,我们可以下一个结论:Java中集合的泛型,是为了防止错误输入的,只在编译阶段有效,绕过编译就无效了,我可以通过方法的反射来操作,绕过编译:
Method m = c1.getMethod("add", Object.class);
m.invoke(list1, 100);
System.out.println(list1.size());
这时候我们看输出结果,size加了1,说明数据已经加进去了,由此证明:Java中集合的泛型,是为了防止错误输入的,只在编译阶段有效,绕过编译就无效了,这个结论是正确的。