<? super E><? extends E>有什么区别?

例如,当您查看类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形式,因此它保证当从集合中提取fetches个值时,它们都将是E或某个子类(即,它是兼容的).drainTo方法试图将into个值放入集合,因此集合的元素类型必须为E or a superclass.

例如,假设您有这样一个类层次 struct :

Parent extends Object
Child extends Parent

还有LinkedBlockingQueue<Parent>分.您可以在List<Child>中构造此传递,它将安全地复制所有元素,因 for each Child都是父元素.您无法传入List<Object>,因为某些元素可能与Parent不兼容.

同样地,你可以把这个队列排成List<Object>,因为每Parent个队列是Object个队列...但是你不能把它放进List<Child>,因为List<Child>希望它的所有元素都与Child兼容.

Java相关问答推荐

泽西岛:退回到不注射的客户"

如何让HikariCP指标在NewRelic中正确显示?

Android -如何修复Java.time.zone. ZoneRulesExcept:未知时区ID:Europe/Kyiv

参数值[...]与预期类型java.util.Date不匹配

为什么不应用类型推断?

获取字符串中带空格的数字和Java中的字符

从Spring5迁移到Spring6:无法在雅加达包中找到类

什么是Java原子属性的正确getter和setter

Bean定义不是从Spring ApplationConext.xml文件加载的

如何从Keyloak映射Hibernate实体中的用户

未找到适用于响应类型[类java.io.InputStream]和内容类型[Text/CSV]的HttpMessageConverter

如何在构建Gradle项目时排除com.google.guava依赖项的一个变体

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

一对多关系和ID生成

将双倍转换为百分比

除0错误/抱歉我的句子是PT

OAuth:登录后无法查看Google邮箱地址

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

使用Java线程进行并行编程