<? super E>
との違いは何ですか<? extends E>
?
たとえば、クラスを見ると、java.util.concurrent.LinkedBlockingQueue
コンストラクターの次のシグネチャがあります。
public LinkedBlockingQueue(Collection<? extends E> c)
そしてメソッドの1つは次のようになります。
public int drainTo(Collection<? super E> c)
ベストアンサー1
最初の ( <? super E>
) は、それが「E の祖先 (スーパークラス) である何らかの型」であることを示します。2 番目の ( <? extends E>
) は、それが「E のサブクラスである何らかの型」であることを示します。(どちらの場合も、E 自体は問題ありません。)
そのため、コンストラクタは? extends E
フォームを使用して、フェッチコレクションから値を取得すると、それらはすべてEまたはサブクラスになります(つまり互換性があります)。drainTo
メソッドは値を入れようとしていますの中へコレクションは要素型を持たなければなりませんE
またはスーパークラス。
たとえば、次のようなクラス階層があるとします。
Parent extends Object
Child extends Parent
および ですLinkedBlockingQueue<Parent>
。 を渡すことでこれを構築できます。 はList<Child>
すべての要素を安全にコピーします。なぜなら、すべてが親だからです。一部の要素は と互換性がない可能性があるため、Child
を渡すことはできません。List<Object>
Parent
同様に、すべてのは であるList<Object>
ため、そのキューを に排出できます。ただし、 はすべての要素が と互換性があることを前提としているため、に排出することはできません。Parent
Object
List<Child>
List<Child>
Child