私は本番のJavaコードで多くの場合に気付きました.
Collection< ? extends foo> var
私の質問はそうではありません
Collection<foo> var
同じ意味です。一方と他方のセマンティックの違いは何ですか?
ありがとう!
私は本番のJavaコードで多くの場合に気付きました.
Collection< ? extends foo> var
私の質問はそうではありません
Collection<foo> var
同じ意味です。一方と他方のセマンティックの違いは何ですか?
ありがとう!
Collection<? extends Foo>
と一致するためCollection<SubClassOfFoo>
、 whileは一致しCollection<Foo>
ません。
簡単に言うと、 の場合SubClass extends Foo
、それは正しくないCollection<SubClass> extends Collection<Foo>
ため、ワイルドカードを使用して、サブクラスのコレクションを許可することを知らせる必要があります。
メソッドがあるとします
void foo(List<Parent> bar)
合格したいのですがList<Child>
、残念ながら合格できません。が のサブタイプであり、がFoo
のサブタイプでない場合、ジェネリック コンテナは「共変」ではなく、不変です。これを修正するために、ワイルドカードを使用します。Bar
List<Foo>
List<Bar>
メソッドを宣言すると
void foo(List<? extends Parent> bar)
List<Child>
これで、 aまたは aを渡すことができますList<Parent>
。ワイルド カードを使用するとextends
、共分散が得られます。
二重に、サブタイプであるオブジェクトのリストを渡したい場合はChild
、次のことができます
void foo(List<? super Child>)
を渡しますList<Parent>
。これは「反分散」であり、共分散と同様ですが、失敗します。
少し紛らわしいトピックですが、分散の要点は、コレクションがパラメーターと同じサブタイプとスーパータイプを持つことを許可することです。
Collection<foo> var
foo
とそのサブクラスのみを含むことを意味します。Collection< ? extends foo> var
の特定のサブクラスとfoo
そのサブクラスを 1 つだけ含むことができることを意味します。それはかなり違います。