加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Generic Type toArray和asList

发布时间:2020-12-15 00:52:32 所属栏目:Java 来源:网络整理
导读:我试图理解泛型,我故意想要生成classcastexception,但是,我在第一次尝试时得到一个arraystoreexception. static E E reduce(ListE list,FunctionE f,E initVal) { E[] snapshot = (E[]) list.toArray(); Object[] o = snapshot; o[0] = new Long(1); E resul
我试图理解泛型,我故意想要生成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 []类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读