为什么Collection需要转换为Integer []但Collection <object>不需要?

时间:2016-03-21 20:03:08

标签: java collections

我测试了这段代码:

    Collection l = new ArrayList<Object>();
    l.add(5);
    l.add(2);
    l.add(6);

    Integer[] a=l.toArray(new Integer[0]);//this requires casting to Integer[]

并查看此代码:

   Collection<Object> l = new ArrayList<Object>();
    l.add(5);
    l.add(2);
    l.add(6);

    Integer[] a=l.toArray(new Integer[0]);//this doesn't require casting to Integer[]

第一个问题是

  

为什么首先需要施法但第二部分不需要?

第二个问题是

  

数组的大小并不重要,为什么我们不通过类名或其他方式?是什么原因使api成为这样的?

1 个答案:

答案 0 :(得分:1)

第一个问题与this question有关。在Java 5之前,没有将通用类型引入到该语言中,因此允许原始类型与早期代码兼容。原始类型只是通过忽略方法签名和返回类型中的所有泛型类型信息来工作。因此,当您使用原始类型时,toArray的返回类型将被视为Object[]而非T[]。这就是需要演员表的原因。

第二个问题的前提是有缺陷的。数组的大小很重要,因为如果数组足够大以容纳集合的所有元素,则传递的实际数组将被填充。只有传递的数组太小才会创建相同类型的新数组。

你是正确的,toArray的参数可能有Class<T>而不是T[],但真正的版本有一个优点,即它使数组能够被重用。