<? 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)
第一个 ( <? super E>) 表示它是“某种类型,它是 E 的祖先(超类)”;第二个 ( <? extends E>) 表示它是“某种类型,它是 E 的子类”。(在这两种情况下,E 本身都可以。)
所以构造函数使用这种? extends E形式,因此它保证当它从集合中 获取值时,它们都将是 E 或某个子类(即它是兼容的)。 该drainTo方法试图将值 放入 集合中,因此集合必须具有元素类型E 或超类 。
? extends E
drainTo
E
例如,假设您有这样的类层次结构:
Parent extends Object Child extends Parent
和一个LinkedBlockingQueue<Parent>。您可以构造这个传入 a List<Child>,它将安全地复制所有元素,因为 eachChild是父级。您无法传入 a List<Object>,因为某些元素可能与Parent.
LinkedBlockingQueue<Parent>
List<Child>
Child
List<Object>
Parent
同样,您可以将该队列排入 aList<Object>因为 everyParent是一个Object… 但您不能将其排入 aList<Child>因为List<Child>期望其所有元素与Child.
Object