开始本文之前先看一段代码
ArrayList a1 = new ArrayList();
ArrayList<String> a2 = new ArrayList<String>();
Class c1 = a1.getClass();
Class c2 = a2.getClass();
a2.add("string1");
a2.add("string2");
System.out.println(c1 == c2);
问题:上述代码运行结果是什么?true or false?
很遗憾这种想法是错误的,运行结果是true。
那么为什么会造成这种结果呢?这就要从泛型的机理说起。
验证:我们可以通过方法的反射来绕过编译,从而绕过泛型。(关于反射请查看我写的相关博文,此处略过)。
try {
Method method = c2.getMethod("add", Object.class);
method.invoke(a2, 20);
System.out.println(a2);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}