0

私は本番のJavaコードで多くの場合に気付きました.

Collection< ? extends foo> var

私の質問はそうではありません

Collection<foo> var 

同じ意味です。一方と他方のセマンティックの違いは何ですか?

ありがとう!

4

3 に答える 3

1

Collection<? extends Foo>と一致するためCollection<SubClassOfFoo>、 whileは一致しCollection<Foo>ません。

簡単に言うと、 の場合SubClass extends Foo、それは正しくないCollection<SubClass> extends Collection<Foo>ため、ワイルドカードを使用して、サブクラスのコレクションを許可することを知らせる必要があります。

于 2013-10-30T23:40:00.637 に答える
1

メソッドがあるとします

void foo(List<Parent> bar)

合格したいのですがList<Child>、残念ながら合格できません。が のサブタイプであり、がFooのサブタイプでない場合、ジェネリック コンテナは「共変」ではなく、不変です。これを修正するために、ワイルドカードを使用します。BarList<Foo>List<Bar>

メソッドを宣言すると

void foo(List<? extends Parent> bar)

List<Child>これで、 aまたは aを渡すことができますList<Parent>。ワイルド カードを使用するとextends、共分散が得られます。

二重に、サブタイプであるオブジェクトのリストを渡したい場合はChild、次のことができます

void foo(List<? super Child>)

を渡しますList<Parent>。これは「反分散」であり、共分散と同様ですが、失敗します。

少し紛らわしいトピックですが、分散の要点は、コレクションがパラメーターと同じサブタイプとスーパータイプを持つことを許可することです。

于 2013-10-30T23:43:30.247 に答える
0

Collection<foo> varfooとそのサブクラスのみを含むことを意味します。Collection< ? extends foo> varの特定のサブクラスとfooそのサブクラスを 1 つだけ含むことができることを意味します。それはかなり違います。

于 2013-10-30T23:40:59.717 に答える