黑马程序员技术交流社区
标题:
一个关于泛型的问题
[打印本页]
作者:
衣带赞
时间:
2013-11-21 14:45
标题:
一个关于泛型的问题
本帖最后由 衣带赞 于 2013-11-21 14:48 编辑
因为集合的泛型只作用于编译时期,所以可以通过 .class 文件的反射方式往ArrayList<E>中加入不是<E>的类型参数,但是这里出了个小问题,大家帮忙看看。
package cn.itcast.day2;
import java.util.ArrayList;
public class MethodTest {
public static void main(String[] args) throws Exception{
ArrayList<Integer> al1 = new ArrayList<Integer>();
ArrayList<String> al2 = new ArrayList<String>();
al1.add(123);
al2.add("abc");
al1.getClass().getMethod("add", Object.class).invoke(al1, "gg");
System.out.println(al1);
System.out.println(al1.get(1));
al2.getClass().getMethod("add", Object.class).invoke(al2,888);
System.out.println(al2);
System.out.println(al2.get(1));
}
}
复制代码
这个运行的结果是
[123, gg]
gg
[abc, 888]
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at cn.itcast.day2.MethodTest.main(MethodTest.java:21)
复制代码
System.out.println(al2.get(1));
这句话执行错误了,而且从打印集合的结果来看,明显已经把888加入了al2中,但是无法打印出来,这是什么原因?
作者:
likeermei
时间:
2013-11-22 01:39
你al2指定是string而你存入的int 取出时涉及到了提升
作者:
简★零度
时间:
2013-11-22 02:39
亲,你的代码出现的异常为ClassCastException。类型转换异常。也就是通常说的类型不匹配。
System.out.println(al2.get(0));这里改动一下就可以了,还有,下次写代码记得加注释,看起来真的很费劲
还有,这道题你到底要做什么总要说吧?
作者:
freehiker
时间:
2013-11-22 11:51
这个问题楼主主要是想表达为什么类型参数是Integer的集合,通过反射加入字符串可以成功的输出,而类型参数是String的集合,通过反射加入Integer就会出现ClassCastException。
我看了一下,
类型参数是其他的都可以成功的通过反射加入其他类型的数据,唯独类型参数是String的集合,通过反射加入其他类型的数据会出现类型转换异常
楼上说的String中存入int,本身反射中不涉及到类型参数,而且就算普通的String中存入int,虽然编译错误,但也应该是说String中存入Integer,集合类不能存入基本类型数据,会做一个装箱动作,自动将基本类型转换成包装类
作者:
衣带赞
时间:
2013-11-23 21:55
freehiker 发表于 2013-11-22 11:51
这个问题楼主主要是想表达为什么类型参数是Integer的集合,通过反射加入字符串可以成功的输出,而类型参数 ...
对的,我就是这个意思,正如你所说,这个转换异常让我很惊讶,我试过自己写一个类加入String中,并覆盖了类中的toString方法,结果也是不能输出。不是int数据类型的问题,这个原理我也不清楚,根本就找不到解释,我也很困惑。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2