? super E : 指的是E及其E的父类,指定了泛型的下限(E),由于指定了泛型的下限E,所以添加的对象只能是E或者E的子类,这样就不会出现类型转换错误,这就可以添加了,编译成功。从上面的示例中,我们看出,? extend E,不能添加元素,只能添加无意义的null。我们想要添加元素,该怎做办呢?可以使用 super E>。
那么这里,我们可以总结一条规律,“Producer Extends,Consumer Super”,意思是:
Producer Extends:如果你需要一个只读的List,用它来produce T,那么使用 ? extends T
Consumer Super:如果你需要一个只写的List,用它来consumer T,那么使用 ? super T
如果需要同时读取和写入,那么就不能使用通配符了。
Java集合类的源码中,经常有将两者结合起来使用的,如:
public class Collections{
public static 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
dest.set(i, src.get(i));
} else {
ListIterator super T> di=dest.listIterator();
ListIterator extends T> si=src.listIterator();
for (int i=0; i
di.next();
di.set(si.next());
}
}
}
}