Java中的通配符extends和super

Java中的通配符extends和super

extends

// Number "extends" Number (in this context)
List<? extends Number> foo3 = new ArrayList<Number>();
// Integer extends Number
List<? extends Number> foo3 = new ArrayList<Integer>();
// Double extends Number
List<? extends Number> foo3 = new ArrayList<Double>(); 
  1. 读操作(Reading)

    给定以上的赋值语句,可以从foo3中读取什么类型的元素呢?

    Number:Yes,因为foo3中的任何元素都可以保证是Number或Number的子类;

    Integer: No,因为foo3有可能指向List<Double>;

    Number: No,因为foo3有可能指向List<Integer>;

  2. 写操作(Wrting)

    给定以上的赋值语句,可以向foo3中添加什么类型的元素呢?

    Integer: No,因为foo3有可能指向List<Double>;

    Number: No, 因为foo3有可能指向List<Integer>;

    PECS(Producer Extends, Consumer Super)

    如果你需要一个List作为Producer(希望从该List中读取T类型的元素),则需要声明该List为List<? extends T>,这时只能进行get操作,无法向List中add任何类型的元素;

    如果你需要一个List作为Consumer(希望向该List中插入T类型的元素),则需要声明该List为List<? super T>,这时无法保证get到的元素的原有类型,只能得出是Object或Object的子类,只能add T或T的子类元素。

    如果你即需要get、也需要add操作,则不能使用通配符,必须精确声明为List<T>。
    举例:
    jdk中Collections类的copy()方法:

    public static <T> void copy(List<? super T> dest, List<? extends T> src) {
            int srcSize = src.size();
            if (srcSize > dest.size())
                throw new IndexOutOfBoundsException("Source does not fit in dest");
    
            if (srcSize < COPY_THRESHOLD ||
                (src instanceof RandomAccess && dest instanceof RandomAccess)) {
                for (int i = 0; i < srcSize; i++)
                    dest.set(i, src.get(i));
            } else {
                ListIterator<? super T> di = dest.listIterator();
                ListIterator<? extends T> si = src.listIterator();
                for (int i = 0; i < srcSize; i++) {
                    di.next();
                    di.set(si.next());
                }
            }
        }
    

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文是在学习和使用kotlin时的一些总结与体会,一些代码示例来自于网络或Kotlin官方文档,持续更新... 对...
    竹尘居士阅读 8,658评论 0 8
  • 泛型 泛型(Generic Type)简介 通常情况的类和函数,我们只需要使用具体的类型即可:要么是基本类型,要么...
    Tenderness4阅读 5,299评论 4 2
  • Java中的逆变与协变 原文:http://www.cnblogs.com/en-heng/p/5041124.h...
    BadGirl_TONG阅读 2,622评论 0 0
  • 今日阳光正好,纽约温度17度,驱车赶往纽约曼哈顿码头,搭乘自由女神环岛游船,近距离欣赏熟悉的自由女神像,它是美...
    鸿雁1238阅读 1,589评论 1 0
  • 记2017.8.1 小雨 于小屋 你只有一个过去,也只有一个现在,却有无限可能的未来。❤️ 过去,现在,...
    会好好生活的婷婷阅读 1,544评论 0 0

友情链接更多精彩内容