zoukankan      html  css  js  c++  java
  • 第25条:列表优先于数组

    数组与泛型相比,有两个重要的不同点。数组是协变的(如果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;  
    }

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

  • 相关阅读:
    LeetCode之Z字形变换
    统计文本中字母的频次(不区分大小写)
    凯撒密码实现
    DES 实现
    cmake 学习
    ubuntu18 ssh服务器拒绝连了密码
    Ubuntu13 安装vim
    面向对象和面向过程的理解
    图像变换
    基于关键帧的RGB-D视觉惯性里程计
  • 原文地址:https://www.cnblogs.com/13jhzeng/p/5719029.html
Copyright © 2011-2022 走看看