我试图理解泛型,我故意想要生成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,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 []类型.