A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐辉辉 中级黑马   /  2012-6-28 20:49  /  2629 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐辉辉 于 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));

3 个回复

倒序浏览
其实泛型并不会跟据返回值的类型来动态判断,Java的泛型是编译时泛型,在运行时没有泛型。这也是,可以将一个String,放入 声明泛型为Integer的list中的原因。

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

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

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

评分

参与人数 1技术分 +3 收起 理由
刘蕴学 + 3 范型还原,不错

查看全部评分

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