日期:2014-05-20  浏览次数:20769 次

关于java利用反射调用泛型类型的问题
今天在看张孝祥老师讲的一个泛型的知识点时,碰到了一个问题,张老师说泛型只是给编译器看的,以张老师举的例子说明:
都是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(String str)这个方法,而你传入的是Integer,你可以试试:

System.out.println(arr2.get(0)+""); 

错误行 一定是  System.out.println(arr2.get(0)); 
System.out.println(arr2.get(0)+""); 这样 也是不行的
可以直接 System.out.println(arr2),其实 你已经绕开了,已经添加进去了