首页 > 编程语言 > 详细

第25条:列表优先于数组

时间:2016-07-29 18:59:04      阅读:268      评论:0      收藏:0      [点我收藏+]

数组与泛型相比,有两个重要的不同点。数组是协变的(如果Sub是Super的子类型,那么数组类型Sub[]是Super[]的子类型),相反,泛型是不可变得,对于任意两个不同的类型T1和T2,List<T1>和List<T2>没有子类型或超类型的关系。

 

//这段代码在运行时出错
Object[] o = new Long[1];
o[0] = "I don‘t fit it";

//这段代码在编译时出错
List<Object> o = new ArrayList<Long>();
o.add("I don‘t fit it";

 

一段代码:

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

会有一条警告,编译器无法再编译时知道E是什么,所以是一个非受检的警告。

 

修改成列表代替数组:

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

这样不会再收到警告,因为编译器可以保证类型转换自动进行,不会出错。

第25条:列表优先于数组

原文:http://www.cnblogs.com/13jhzeng/p/5719029.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!