先看下面的例子:
ArraList list1=new ArraList();
Arralist<String>list2=new Arralist<String>();
list2.add("hello");
list2.add(100);//错误的
Class c1=list1.getClass();
Class c2=list2.getClass();
System.out.print(c1==c2);//true
反射的操作都是编译之后的操作
对于第一个是普通方法在编译时,只支持String,所以报错。第二个说明编译之后的泛型是去泛型化的。
下面我们可以通过方法的反射来操作第一个。
try{
Method m= c2.getMethod("add",Object.class);
m.invoke(list2,20);//绕过了编译操作就绕过了泛型
System.out.print(list2.size());//结果为2了,成功
}