黑马程序员技术交流社区

标题: 反射技术中 泛型问题 [打印本页]

作者: 胡文彬    时间: 2014-3-11 15:58
标题: 反射技术中 泛型问题
本帖最后由 胡文彬 于 2014-3-12 22:19 编辑

下面是代码
public static void main(String[] args) throws Exception {
                        ArrayList<String> lists = new ArrayList<String>();
                        lists.add("wei");
                        lists.add("xiaoming");
                        lists.getClass().getMethod("add",Object.class).invoke(lists,3);
                        System.out.println(lists.get(2));
                        
                        ArrayList<Integer> collection = new ArrayList<Integer>();
                        collection.add(1);
                        collection.getClass().getMethod("add", Object.class).invoke(collection,"abc");
                        System.out.println(collection.get(1));
                        
                }
为什么我不能将Integer类型的数据加到String类型的集合中去呢?
将String类型的数据却可以顺利加入到Integer类型的集合中呢?
问题出在哪里呢?????
作者: 房建斌    时间: 2014-3-11 16:28
这是由于System.out.println()方法的原因。
  1. ArrayList<String> lists = new ArrayList<String>();
  2.         lists.add("wei");
  3.         lists.add("xiaoming");
  4.         lists.getClass().getMethod("add",Object.class).invoke(lists,3);
  5.         lists.get(2);
  6.         System.out.println(lists.get(2));
复制代码

这段代码里,给System.out.println()放入的是一个String,我们来看看源码:
  1. public void println(String x) {
  2.         synchronized (this) {
  3.             print(x);
  4.             newLine();
  5.         }
  6.     }
复制代码
所以这里会把实际的类型当做了String,可是实际类型是Integer,会进行一个强转。导致了ClassCastException。

再来看第二段代码:
  1. ArrayList<Integer> collection = new ArrayList<Integer>();
  2.         collection.add(1);
  3.         collection.getClass().getMethod("add", Object.class).invoke(collection,"abc");
  4.         System.out.println(collection.get(1));
复制代码
这段代码里给System.out.println()放的是一个Integer,我们看看源码:
  1.     public void println(Object x) {
  2.         String s = String.valueOf(x);
  3.         synchronized (this) {
  4.             print(s);
  5.             newLine();
  6.         }
  7.     }
复制代码
  1. public static String valueOf(Object obj) {
  2.         return (obj == null) ? "null" : obj.toString();
  3.     }
复制代码
这里把Integer当做一个对象,然后调用String.valueOf()方法去把Integer转成一个String了,显然这里没有进行强制转换。

所以出错的原因就是第一段代码进行了强转,而第二段代码没有进行强转。所以第一段代码出错,而第二段代码正常。









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2