我试图理解泛型,我故意想要生成classcastexception,但是,我在第一次尝试时得到了一个arraystoreexception。
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));
}
有什么区别?
答案 0 :(得分:3)
在我看来,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 []。
答案 1 :(得分:0)
我不知道你为什么要创建一个数组。就这样做:
static <E> E reduce(List<E> list, Function<E> f, E initVal) {
for (E e : list)
initVal = f.apply(initVal, e);
return initVal;
}
请参阅:KISS principle