小编典典

和有什么区别?

all

<? super E>和 和有什么不一样<? extends E>

例如,当您查看类时java.util.concurrent.LinkedBlockingQueue,构造函数有以下签名:

public LinkedBlockingQueue(Collection<? extends E> c)

对于方法之一:

public int drainTo(Collection<? super E> c)

阅读 60

收藏
2022-08-08

共1个答案

小编典典

第一个 ( <? super E>) 表示它是“某种类型,它是 E 的祖先(超类)”;第二个 ( <? extends E>)
表示它是“某种类型,它是 E 的子类”。(在这两种情况下,E 本身都可以。)

所以构造函数使用这种? extends E形式,因此它保证当它从集合中 获取值时,它们都将是 E 或某个子类(即它是兼容的)。
drainTo方法试图将值 放入 集合中,因此集合必须具有元素类型E 或超类

例如,假设您有这样的类层次结构:

Parent extends Object
Child extends Parent

和一个LinkedBlockingQueue<Parent>。您可以构造这个传入 a List<Child>,它将安全地复制所有元素,因为
eachChild是父级。您无法传入 a List<Object>,因为某些元素可能与Parent.

同样,您可以将该队列排入 aList<Object>因为 everyParent是一个Object… 但您不能将其排入
aList<Child>因为List<Child>期望其所有元素与Child.

2022-08-08