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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© oracleserver 初级黑马   /  2012-6-25 14:51  /  1995 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么在一个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));
    }
}
大家看好了!为什么呢?

5 个回复

倒序浏览
泛型是string,你存一个int 你存String当然要放String了。。。,你还不如把泛型撤掉呢。。。
回复 使用道具 举报
类Integer有个构造函数是Integer(String s),构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
回复 使用道具 举报
只是个人的一些理解:
因为你的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();
        }
}

这样写可以输出正确结果

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 游洪波 于 2012-6-25 19:00 编辑

我来给你解释下吧!你看看这张图

上边那个是Integer类的构造函数摘要信息
总共有两个一个是 Integer(int value)表示可以传入一个int类型的参数。另外一个是Integer(String s)表示可以传入一个String类型的但是必须是数字类型的参数,否则会报错。
我把API的图给你抓上来了,这下你明白你的那个 List<Integer> 这个集合可以 用 add(“1.1”);了吧。
下边是String 类的构造函数再要信息

里边包含了15中构造方式,其中唯独没有以int类型为参的构造函数。所以你在List<String>这个集合中使用 add(1.1);是错误的。这下你明白了吧。
---------------------------------------------------------------------------------------------------------------------------
版主给点分吧,看在我扒拉这么久的份上!呵呵呵

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 许涛 于 2012-6-25 19:31 编辑

泛型的作用就是限定非法类型的数据传入,你先在集合中限定只能传入Integer对象,而后又传入String类型的对象,这样的作法前后矛盾,自然会出错了。


不过你要是一定想在Integer类型的集合中传入String类型的对象,通过反射可以实现,代码如下
  1. import java.lang.reflect.Method;
  2. import java.util.ArrayList;
  3. import java.util.List;

  4. public class Demo {
  5.     public static void go(List list)
  6.     {
  7.         list.add("1.1");
  8.     }
  9.     public static void main(String args[]) throws Exception
  10.     {
  11.         List<Integer> list=new ArrayList<Integer>();
  12.         list.add(1);
  13.         go(list);
  14.         
  15.         //打印反射前集合
  16.         System.out.println(list);
  17.         
  18.         list.getClass().getMethod("add", Object.class).invoke(list, "abc");
  19.         
  20.         //打印反射后集合
  21.         System.out.println(list);
  22.     }
  23. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马