<? super E>
和<? extends E>
有什么区别?
例如,当您查看类java.util.concurrent.LinkedBlockingQueue
时,构造函数有以下签名:
public LinkedBlockingQueue(Collection<? extends E> c)
其中一个用于该方法:
public int drainTo(Collection<? super E> c)
<? 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
兼容.