黑马程序员技术交流社区

标题: 反射 加 泛型 不解!!! [打印本页]

作者: 唐辉辉    时间: 2012-6-28 20:49
标题: 反射 加 泛型 不解!!!
本帖最后由 唐辉辉 于 2012-6-29 13:06 编辑

                ArrayList<Integer> arrList = new ArrayList<Integer>();
                arrList.getClass().getMethod("add", Object.class).invoke(arrList, "abc");
               
                String str = arrList.get(0).getClass().getName();
                //这里arrList.get(0),get方法的返回值类型是一个泛型,所以这个泛型会根据返回值类型来判断。这里返回值类型是String。返回值再.getClass().getName();为什么会报类型转换异常呢?
                System.out.println(str);                //System.out.println(arrList.get(0));

作者: 赵倩倩    时间: 2012-6-28 21:15
其实泛型并不会跟据返回值的类型来动态判断,Java的泛型是编译时泛型,在运行时没有泛型。这也是,可以将一个String,放入 声明泛型为Integer的list中的原因。

这个时候,你去get(0),由于泛型的原因,他被认为是<? extends Integer>,但他其实是个String,所以会报类型转换异常。

可以这样来避开泛型的检查
Object obj = arrList.get(0);
System.out.println(obj.getClass().getName());

这时就可以得到正确的结果java.lang.String

作者: sbeeqnui1987    时间: 2012-6-29 01:45
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数;
参考下子:
举个例子来说
你的钱包里你规定只装钱
那么你去出来的想也不想就是钱,管他是¥还是$不用转换的-->都是钱(确定里面是什么)
不用泛型的话 就不规定放什么
那么你取出来的东西就不一定是钱,这样你就要转换了,那要是石头的话你要转换成钱就错了(不确定里面到底是什么)
这使得代码更加可读,并且减少了出错机会。
作者: 周朋飞    时间: 2012-6-29 02:55
引用张老师比较经典的一句话: java运行时是去类型化的,所以你定义的泛型在运行的时候是没有效果的,这也是你能通过反射将String类型的变量放进你定义的整形的数组中的原因,java编译的时候回去判断类型,但是运行的时候就去类型化了,反射就是跳过了编译这个阶段,所以不会出错,当你在IDE中debug的时候你会发现,arrList运行完之后存放的实际上是Object类型的变量,所以楼上说能用Object类接受,就是这个原因




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