<? super E>和之间有什么区别<? extends E>?
<? super E>
<? extends E>?
例如,当你查看类时java.util.concurrent.LinkedBlockingQueue,构造函数具有以下签名:
java.util.concurrent.LinkedBlockingQueue
public LinkedBlockingQueue(Collection<? extends E> c)
对于方法之一:
public int drainTo(Collection<? super E> c)
第一个说是“是E的祖先的某种类型”。第二个说是“某种类型,它是E的子类”。(在两种情况下,E本身都可以。)
E
因此,构造函数使用该? extends E形式,以确保在从集合中获取值时,它们将全部为E或某个子类(即,它是兼容的)。该drainTo方法试图将值放入集合中,因此集合必须具有E 或超类的元素类型。
extends E
drainTo
例如,假设你有一个这样的类层次结构:
Parent extends Object Child extends Parent
和一个LinkedBlockingQueue<Parent>。你可以构造一个传入的,以List<Child>安全地复制所有元素,因为每个元素Child都是父元素。你无法传入,List<Object>因为某些元素可能与不兼容Parent。
LinkedBlockingQueue<Parent>
List<Child>
List<Object>
同样,你可以将队列排入a,List<Object>因为每个队列Parent都是Object...,但是你不能将其排入a,List<Child>因为List<Child>期望所有元素都与兼容Child。
a
Parent
Object...
Child