张孝祥老师讲的一个泛型的知识点时,碰到了一个问题,张老师说泛型只是给编译器看的,以张老师举的例子说明:
都是ArrayList类型的对象,一个是String型(ArrayList<String>)arr1,另一个是Integer型(ArrayList<Integer>)arr2,这两个对象在编译完成后生成的字节码是相同的,利用反射调用add方法时应该可以把泛型屏蔽的,但是我碰到了下面的问题,代码如下:- ArrayList<Integer> arr1 = new ArrayList<Integer>();
- arr1.getClass().getMethod("add", Object.class).invoke(arr1, "abc");
- System.out.println(arr1.get(0));
复制代码 上面这个没有问题,可以把泛型屏蔽掉,但是下面的却不行:- ArrayList<String> arr2 = new ArrayList<String>();
- arr2.getClass().getMethod("add", Object.class).invoke(arr2, 2);
- System.out.println(arr2.get(0));
复制代码 运行报了异常:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at day1.GenericTest.main(GenericTest.java:34)
不知道为什么,String型的可以屏蔽,Integer的却不行
|