黑马程序员技术交流社区
标题:
通过反射绕过泛型机制问题
[打印本页]
作者:
Clare0621
时间:
2014-1-3 23:06
标题:
通过反射绕过泛型机制问题
本帖最后由 Clare0621 于 2014-1-4 21:02 编辑
在张老师视频中看到关于通过反射绕过集合的泛型机制问题:
视频中,张老师定义了一个Integer类型的ArrayList,然后通过反射想集合中添加了一个字符串,并成功输出到控制台。
我自己定义了一个String类型的ArrayList,然后通过反射向其中添加了一个Integer元素,打印时就出现了类型转换异常,编译没问题。代码如下:
public class GenericTest {
public static void main(String[] args) throws Exception {
//通过反射可绕过泛型机制
ArrayList<String> collection = new ArrayList<String>();
collection.add("abc");
collection.getClass().getMethod("add", Object.class).invoke(collection, 4);
System.out.println(collection.get(1));
}
复制代码
谁能解释下什么原因?
作者:
taoge
时间:
2014-1-4 14:15
PrintStream类中有println(Object x), println(String x),但是没有println(Integer x)
ArrayList<Integer> collection = lst;
执行的是println(Object x),先执行String.valueOf(x), 然后再用print(String)打印,所以不会出错。
ArrayList<String> collection = lst;
执行的是println(String x)方法,Integer转String出错。
你把鼠标放在println上就能看到调用的是println(String x)方法方法。与反射和泛型没有关系
作者:
hurryup
时间:
2014-1-4 16:17
上次有人在帖子中分析过其中的原因。
问题就是泛型参数是String类型时,在往泛型集合中添加Integer,又用System.out.println()获取
该数据时,会要求强制转换为String类型,所以会报类型转换异常.
我就知道一个结论:
在通过反射的方式向泛型集合中加入不同类型的数据时:
所有泛型参数是8种基本数据类型的封装类都可以用System.out.println(collection.get(1))获取;
所有泛型参数是引用数据类型的都要用反射的方式来获取
即collections2.getClass().getMethod("get", int.class).invoke(collection, 1);
作者:
李兴
时间:
2014-1-4 16:27
代码如下:
public static void main(String[] args) throws Exception {
//通过反射可绕过泛型机制
ArrayList<String> collection = new ArrayList<String>();
collection.add("abc");
collection.getClass().getMethod("add", Object.class).invoke(collection, 4);
/*这是ArrayList的get方法public E get(int index)
* 因为他返回一个泛型结果E,所以collection的get返回的是String类型,
* 而collection.get(1)实际得到的数据类型是Integer(add将int型封装为Integer类型),
* 类型不匹配,报告转化异常,不能将Integer转化为String类型,
*
* 下面这两种都会失败
* Integer i = collection.get(1); //因为类型不可转化,所以编译不通过
* String s = collection.get(1); //编译器认为类型相同,编译通过,可运行就会失败
* 要想得到集合中的4这个值,就只用找Integer与String类型的父集,也就是Object类型,
* Object类型是String的父类,所以编译器不会报编译错误
* Object类型是Integer的父类,所以也不会报运行错误
* 搞定
* */
Object o = collection.get(1);
System.out.println(o);
}
复制代码
希望你能采纳
作者:
午夜b'Boy
时间:
2014-1-4 17:13
哇哈哈,受教了
作者:
Clare0621
时间:
2014-1-4 21:02
额,明白了,谢谢诶楼上诸位。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2