今天在看张孝祥老师讲的一个泛型的知识点时,碰到了一个问题,张老师说泛型只是给编译器看的,以张老师举的例子说明:
都是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:30)
不知道为什么,String型的可以屏蔽,Integer的却不行,有哪位高手能指点一下。
错误行数是这行:
arr2.getClass().getMethod("add", Object.class).invoke(arr2, 2);
还是这行?
System.out.println(arr2.get(0));
如果是第二个,我猜是调用了System.out.println(String str)这个方法,而你传入的是Integer,你可以试试:
System.out.println(arr2.get(0)+"");LZ,
这个也是可以屏蔽的,错误原因是由于你的System.out.println(arr2.get(0));
ArrayList<String> arr2 = new ArrayList<String>();
arr2.getClass().getMethod("add", Object.class).invoke(arr2, 2);
System.out.println(String.valueOf(arr2.get(0)));
这样程序就正常OK,输出为2!
错误行 一定是 System.out.println(arr2.get(0));
System.out.println(arr2.get(0)+""); 这样 也是不行的
可以直接 System.out.println(arr2),其实 你已经绕开了,已经添加进去了