首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于java利用反射调用泛型类型的有关问题

2013-01-05 
关于java利用反射调用泛型类型的问题今天在看张孝祥老师讲的一个泛型的知识点时,碰到了一个问题,张老师说

关于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),其实 你已经绕开了,已经添加进去了




热点排行
Bad Request.