来自《Effective Java》的一句话,producer-extends,consumer-super,两者通过规定上下界的形式来做数据限制。
demo
class Fruit { } class Apple extends Fruit { } class Jonathan extends Apple { } class Orange extends Fruit { }
代码继承关系:
extends T>Jonathan extennds Apple
Apple extends Fruit
限制生产者的数据来源。
可见,使用通配符引入逆变时,使用 extends T>指定了泛型的下界为Apple,即只能Apple的父类做List *** 作才安全,对于Apple的子类是不安全的。
super T>限制消费者数据流入。
在数据流入时,apples可以使用Apple本身的实例和Apple子类放入List中,但是不允许Apple的父类存放,这就限制了数据的使用类型。
// Collections.java public staticvoid 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 di=dest.listIterator(); ListIterator extends T> si=src.listIterator(); for (int i=0; i 复制的target只能是泛型T的实例对象或泛型T的子类。
复制的src只能是泛型T的实例对象或泛型T的父类。
// Collections.java public staticvoid 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 di=dest.listIterator(); ListIterator extends T> si=src.listIterator(); for (int i=0; i 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)