泛型类型toArray和asList

我试图了解泛型,并且我故意要生成一个classCastexception,但是,我反而会在第一次尝试时得到一个数组存储异常。

    static <E> E reduce(List<E> list, Function<E> f, E initVal) {

    E[] snapshot = (E[]) list.toArray();

    Object[] o = snapshot;
    o[0] = new Long(1);

    E result =  initVal;
    for (E e : snapshot)
        result = f.apply(result, e);


    return result;
}


private static final Function<Integer> SUM = new Function<Integer>(){
    public Integer apply(Integer i1, Integer i2) {
        return i1 + i2;
    }
};

public static void main(String[] args) {
    List<Integer> intList = Arrays.asList(2, 7);
    System.out.println(reduce(intList, SUM, 0));
}

在第二次尝试..我正确得到一个ClassCastException使用此...

public static void main(String[] args) {
    List<Integer> intList1 = Arrays.asList(2, 7);
    List<Integer> intList = new ArrayList<Integer>(intList1);
    System.out.println(reduce(intList, SUM, 0));
}

有什么不同?


在我看来,由Arrays.asList()生成的List实例并没有正确地实现toArray()方法的契约。 从List.toArray()javadoc:

Note that toArray(new Object[0]) is identical in function to toArray(). 

但请注意以下测试:

public static void main(String... args) {
  System.out.println(Arrays.asList(2, 7).toArray());
  System.out.println(Arrays.asList(2, 7).toArray(new Object[0]));
}

并输出:

[Ljava.lang.Integer;@3e25a5
[Ljava.lang.Object;@19821f

请注意,根据javadoc,toArray()应该生成一个Object []类型的数组,但Arrays.<E>asList().toArray()生成一个E []类型的数组。

你得到一个ArrayStoreException的原因是因为你的数组的类型是Integer [],当它应该是Object []类型的时候。


我不知道你为什么要创建一个数组。 只要这样做:

static <E> E reduce(List<E> list, Function<E> f, E initVal) {
    for (E e : list)
        initVal = f.apply(initVal, e);
    return initVal;
}

请参阅:KISS原则

链接地址: http://www.djcxy.com/p/8741.html

上一篇: Generic Type toArray and asList

下一篇: How to set index number on map pin image