黑马程序员技术交流社区
标题:
一点小问题list
[打印本页]
作者:
oracleserver
时间:
2012-6-25 14:51
标题:
一点小问题list
为什么在一个Integer的List里面插入一个String的对象读取成功而在一个String的List插入一个整数读取时抛出ClassCastException?看代码。
Integer的List里面插入一个String对象,读取正确。
public class IteratorTestDemo1 {
public static void go(List list)
{
list.add("1.1");
}
public static void main(String args[])
{
List<Integer> list=new ArrayList<Integer>();
list.add(1);
go(list);
System.out.println(list.get(1));
}
}
以下是在一个String的List里面插入一个整型数,读取抛出异常。
public class IteratorTestDemo2 {
public static void go(List list)
{
list.add(1.1);
}
public static void main(String args[])
{
List<String> list=new ArrayList<String>();
list.add("1");
go(list);
System.out.println(list.get(1));
}
}
大家看好了!为什么呢?
作者:
陈嘉宾
时间:
2012-6-25 16:44
泛型是string,你存一个int 你存String当然要放String了。。。,你还不如把泛型撤掉呢。。。
作者:
李伟
时间:
2012-6-25 17:06
类Integer有个构造函数是Integer(String s),构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
作者:
Forever。
时间:
2012-6-25 17:46
只是个人的一些理解:
因为你的go方法内的list是无参的,所以无参的list可以存任何的东西。
而system.out.println()内打印的是字符串,而当你的list内存放的是integer的时候你必须想办法强转过来,但是呢新的问题有出来了,由于你的list的泛型是String所以类型转换不能直接进行,所以你又要另外建一个方法在方法内去做这些操作具体看代码:
public class IteratorTestDemo2 {
public static void go(List list)
{
list.add(5);
}
public static void main(String args[])
{
List<String> list=new ArrayList<String>();
go(list);
System.out.println(exchang(list));
}
private static String exchang(List list) {
// TODO Auto-generated method stub
return list.get(0).toString();
}
}
这样写可以输出正确结果
作者:
游洪波
时间:
2012-6-25 18:58
本帖最后由 游洪波 于 2012-6-25 19:00 编辑
我来给你解释下吧!你看看这张图
1.png
(6.94 KB, 下载次数: 60)
下载附件
2012-6-25 18:51 上传
上边那个是Integer类的构造函数摘要信息
总共有两个一个是
Integer(int value)表示可以传入一个int类型的参数。另外一个是Integer(String s)表示可以传入一个String类型的但是必须是数字类型的参数,否则会报错。
我把API的图给你抓上来了,这下你明白你的那个 List<Integer> 这个集合可以 用 add(“1.1”);了吧。
下边是String 类的构造函数再要信息
2.png
(33.77 KB, 下载次数: 54)
下载附件
2012-6-25 18:56 上传
里边包含了15中构造方式,其中唯独没有以int类型为参的构造函数。所以你在List<String>这个集合中使用 add(1.1);是错误的。这下你明白了吧。
---------------------------------------------------------------------------------------------------------------------------
版主给点分吧,看在我扒拉这么久的份上!呵呵呵
作者:
许涛
时间:
2012-6-25 19:29
本帖最后由 许涛 于 2012-6-25 19:31 编辑
泛型的作用就是限定非法类型的数据传入,你先在集合中限定只能传入Integer对象,而后又传入String类型的对象,这样的作法前后矛盾,自然会出错了。
不过你要是一定想在Integer类型的集合中传入String类型的对象,通过反射可以实现,代码如下
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void go(List list)
{
list.add("1.1");
}
public static void main(String args[]) throws Exception
{
List<Integer> list=new ArrayList<Integer>();
list.add(1);
go(list);
//打印反射前集合
System.out.println(list);
list.getClass().getMethod("add", Object.class).invoke(list, "abc");
//打印反射后集合
System.out.println(list);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2