java - < 和有什么区别? super E> 和 <?扩展 E>?

标签 java generics

<? 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>因为每个 ParentObject ...但您无法将其排入 List<Child>因为 List<Child>期望其所有元素与 Child 兼容.

关于java - < 和有什么区别? super E> 和 <?扩展 E>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1368166/

相关文章:

java - 如何使用 Stream 对两个列表进行配对

java - Apache Chemistry 中AllowableActions 的含义

java - 如何将 log4j 设置为每个错误/警告/信息的特定文件(在 grails 中)

java - JTable 和迭代绑定(bind) ObservableList

java - 可选或默认通用参数

c# - 在 C# 中,List<struct> 中的值是否已装箱?

swift - 约束类型别名不使用约束

java - 从 JAVA 套接字读取比 Python 慢

generics - Swift 通用类型变量应遵守协议(protocol)(类型类)

generics - Swift 2.0 版本的 struct GeneratorOf<T>