public class GenericTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
ArrayList<String> collection2=new ArrayList<String>();
ArrayList<Integer> collection3=new ArrayList<Integer>();
//我们可以看到结果为true,表示编译器编译过程中会把泛型的类型去掉,这样得到的是同一份字节码
System.out.println(collection2.getClass()==collection3.getClass());
//collection3.add("abc");
//用反射跳过编译器,把不同的类型放入collection中(也就是泛型只是给编译器看到)
collection3.getClass().getMethod("add", Object.class).invoke(collection3, "abc");
System.out.println(collection3.get(0));
collection2.getClass().getMethod("add",Object.class).invoke(collection2, 2);
System.out.println(collection2.get(0));
}
}
为什么collection2.getClass().getMethod("add",Object.class).invoke(collection2, 2);
System.out.println(collection2.get(0));这段代码
会报错:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at cn.itext.day2.GenericTest.main(GenericTest.java:43);不是已经跳过编译器了吗?
|