转载自 https://www.coolcou.com/java-tutorial/java-generic-container/java-supertype-wildcards.html
Java 超类型通配符,还有一种通配符,与形式<? extends E>
正好相反,它的形式为<? super E>
,称为超类型通配符,表示E的某个父类型。它有什么用呢?有了它,我们就可以更灵活地写入了。
如果没有这种语法,写入会有一些限制。来看个例子,我们给DynamicArray添加一个方法:
public void copyTo(DynamicArray<E> dest){
for(int i=0; i<size; i++){
dest.add(get(i));
}
}
Java
这个方法也很简单,将当前容器中的元素添加到传入的目标容器中。我们可能希望这么使用:
DynamicArray<Integer> ints = new DynamicArray<Integer>();
ints.add(100);
ints.add(34);
DynamicArray<Number> numbers = new DynamicArray<Number>();
ints.copyTo(numbers);
Java
Integer是Number的子类,将Integer对象拷贝入Number容器,这种用法应该是合情合理的,但Java会提示编译错误,理由我们之前也说过了,期望的参数类型是Dynamic-Array<Integer>
, DynamicArray<Number>
并不适用。
如之前所说,一般而言,不能将DynamicArray<Integer>
看作DynamicArray<Number>
,但我们这里的用法是没有问题的,Java解决这个问题的方法就是超类型通配符,可以将copyTo代码改为:
public void copyTo(DynamicArray<? super E> dest){
for(int i=0; i<size; i++){
dest.add(get(i));
}
}
Java
这样,就没有问题了。