一尘不染

Java 之间有什么区别 <? super E> and <? extends E>?

java

<? super E>和之间有什么区别<? extends E>?

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

public LinkedBlockingQueue(Collection<? extends E> c)

对于方法之一:

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

阅读 470

收藏
2020-03-15

共1个答案

一尘不染

第一个说是“是E的祖先的某种类型”。第二个说是“某种类型,它是E的子类”。(在两种情况下,E本身都可以。)

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

例如,假设你有一个这样的类层次结构:

Parent extends Object
Child extends Parent

和一个LinkedBlockingQueue<Parent>。你可以构造一个传入的,以List<Child>安全地复制所有元素,因为每个元素Child都是父元素。你无法传入,List<Object>因为某些元素可能与不兼容Parent。

同样,你可以将队列排入aList<Object>因为每个队列Parent都是Object...,但是你不能将其排入a,List<Child>因为List<Child>期望所有元素都与兼容Child

2020-03-15