<? super E>
和 <? extends E>
有什么区别?
例如,当您查看类 java.util.concurrent.LinkedBlockingQueue
时,构造函数有以下签名:
public LinkedBlockingQueue(Collection<? extends E> c)
对于方法之一:
public int drainTo(Collection<? super E> c)
原文由 Tomasz Błachowicz 发布,翻译遵循 CC BY-SA 4.0 许可协议
第一个(
<? super E>
)说它是“某种类型,它是 E 的祖先(超类)”;第二个(<? extends E>
)说它是“某种类型,是 E 的子类”。 (在这两种情况下,E 本身都可以。)因此构造函数使用
? extends E
形式,因此它保证当它从集合中 获取 值时,它们都是 E 或某个子类(即它是兼容的)。drainTo
方法试图将值 放入 集合中,因此集合的元素类型必须为E
_或超类_。例如,假设您有一个这样的类层次结构:
和一个
LinkedBlockingQueue<Parent>
。您可以在List<Child>
中构造此传递,这将安全地复制所有元素,因为每个Child
都是父元素。您无法传入List<Object>
因为某些元素可能与Parent
不兼容。Likewise you can drain that queue into a
List<Object>
because everyParent
is anObject
… but you couldn’t drain it into aList<Child>
因为List<Child>
期望它的所有元素都与Child
兼容。