<? super E>
和有什么区别?和 <? extends E>
?
例如,当您查看类(class) java.util.concurrent.LinkedBlockingQueue
时构造函数有以下签名:
public LinkedBlockingQueue(Collection<? extends E> c)
方法之一:
public int drainTo(Collection<? super E> c)
最佳答案
第一个( <? super E>
)说它是“某种类型,它是 E 的祖先(父类(super class))”;第二个( <? extends E>
)说它是“某种类型,它是 E 的子类”。 (在这两种情况下,E 本身都可以。)
所以构造函数使用 ? extends E
形式,因此它保证当它从集合中获取值时,它们都将是 E 或某个子类(即它是兼容的)。 drainTo
方法试图将值放入集合中,因此集合的元素类型必须为 E
或父类(super class)。
例如,假设您有这样的类层次结构:
Parent extends Object
Child extends Parent
还有一个 LinkedBlockingQueue<Parent>
.您可以在 List<Child>
中构造此传递这将安全地复制所有元素,因为每个 Child
是 parent 。你不能传入 List<Object>
因为某些元素可能与 Parent
不兼容.
同样,您可以将该队列排入 List<Object>
因为每个 Parent
是 Object
...但您无法将其排入 List<Child>
因为 List<Child>
期望其所有元素与 Child
兼容.
关于java - < 和有什么区别? super E> 和 <?扩展 E>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1368166/