黑马程序员技术交流社区
标题:
反射技术中 泛型问题
[打印本页]
作者:
胡文彬
时间:
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()方法的原因。
ArrayList<String> lists = new ArrayList<String>();
lists.add("wei");
lists.add("xiaoming");
lists.getClass().getMethod("add",Object.class).invoke(lists,3);
lists.get(2);
System.out.println(lists.get(2));
复制代码
这段代码里,给
System.out.println()放入的是一个String,我们来看看源码:
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
复制代码
所以这里会把实际的类型当做了String,可是实际类型是Integer,会进行一个强转。导致了
ClassCastException。
再来看第二段代码:
ArrayList<Integer> collection = new ArrayList<Integer>();
collection.add(1);
collection.getClass().getMethod("add", Object.class).invoke(collection,"abc");
System.out.println(collection.get(1));
复制代码
这段代码里给System.out.println()放的是一个Integer,我们看看源码:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
复制代码
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
复制代码
这里把Integer当做一个对象,然后调用String.valueOf()方法去把Integer转成一个String了,显然这里没有进行强制转换。
所以出错的原因就是第一段代码进行了强转,而第二段代码没有进行强转。所以第一段代码出错,而第二段代码正常。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2