黑马程序员技术交流社区

标题: 泛型的小问题 [打印本页]

作者: 黑马刘杰    时间: 2013-2-23 15:12
标题: 泛型的小问题
本帖最后由 黑马刘杰 于 2013-2-23 15:54 编辑

原帖地址http://bbs.itheima.com/thread-26006-1-1.html

ArrayList<? extends Object> aList = new ArrayList<String>();
不可以向aList中添加任何元素,因为不能保证aList中真正保存什么类型的对象。aList中还可以保存Integer类型呢,所以aList中不能添加元素。
不能添加元素,要这玩意干啥呢?
是为了向外读数据,比如,一列表中充满了数据,从中向外读数据就是很有用的比如从List<Integer>列表中把数据读出来,复制到List<Number>中。

我现在有一个疑问,为什么下面代码会报异常?
  1. Collection<Integer> aCol=new ArrayList<Integer>();
  2.                 aCol.add(1);
  3.                 aCol.add(2);
  4.                 aCol.add(3);
  5.                
  6.                 List<? extends Number> srcList = new ArrayList<Integer>(aCol);
  7.                 System.out.println(srcList);//这里输出[1,2,3]
  8.                
  9.                 ArrayList<Number> destList = new ArrayList<Number>();

  10.                 Collections.copy(destList, srcList);//这儿报异常
复制代码

作者: 顾传文    时间: 2013-2-23 15:39
原因:
Collections.copy(destList, srcList);将srcList中的元素复制到destList中。但必须保证destList中元素的个数要等或大于srcList中元素的个数。
解决:给destList添加几个元素。
     Collection<Integer> aCol=new ArrayList<Integer>();
        aCol.add(1);
        aCol.add(2);
        aCol.add(3);
        List<? extends Number> srcList = new ArrayList<Integer>(aCol);
        System.out.println(srcList);//这里输出[1,2,3]
        
        List<Number> destList = new ArrayList<Number>(5);
        destList.add(2);
        destList.add(4);
        destList.add(5);
        destList.add(6);
        Collections.copy(destList, srcList);
        System.out.println(destList);//打印[1,2,3,6]
作者: 杨杨    时间: 2013-2-23 15:45
查看源码
if (srcSize > dest.size())
            throw new IndexOutOfBoundsException("Source does not fit in dest");
所有解决
ArrayList<Number>  destList = new ArrayList<Number>(100);
        destList.add(2);
        destList.add(3);
        destList.add(9);
        destList.add(11);
               
        Collections.copy(destList, srcList);//这儿报异常
        System.out.println(destList);


作者: 杨杨    时间: 2013-2-23 15:48
构造方法  int initialCapacity 不好用   ArrayList<Number>  destList = new ArrayList<Number>(100);
弄成100 不好用
作者: 黑马刘杰    时间: 2013-2-23 15:54
顾传文 发表于 2013-2-23 15:39
原因:
Collections.copy(destList, srcList);将srcList中的元素复制到destList中。但必须保证destList中元 ...

谢谢啊,我明白了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2