との違いは何ですか ?質問する

との違いは何ですか ?質問する

<? 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>ため、そのキューを に排出できます。ただし、 はすべての要素が と互換性があることを前提としているため、に排出することはできません。ParentObjectList<Child>List<Child>Child

おすすめ記事