1. ホーム
  2. java

[解決済み] super E>と<extends E>の違いは何ですか?

2022-05-02 16:01:32

質問

とはどのような違いがあるのでしょうか? <? super E><? extends E> ?

例えば、クラス java.util.concurrent.LinkedBlockingQueue コンストラクタに次のようなシグネチャがあります。

public LinkedBlockingQueue(Collection<? extends E> c)

とメソッドに1つずつ。

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

解決方法は?

最初の( <? 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> なぜなら、すべての ParentObject ...しかし、あなたはそれを List<Child> なぜなら List<Child> との互換性があることを期待します。 Child .