2

これらのリストの内容の違いを平易な英語でどのように説明しますか?

参考になる簡単な比較を探しています。

/* 1 */ List<          List<          Dog>>
/* 2 */ List<          List<? extends Dog>>
/* 3 */ List<? extends List<          Dog>>
/* 4 */ List<? extends List<? extends Dog>>

のジェネリック宣言superは似ています。では、これらはどうでしょうか。

/* 5 */ List<? super   List<? extends Dog>>
/* 6 */ List<? extends List<? super   Dog>>

関連する質問とリソース

4

3 に答える 3

7
  1. List要素が犬のリストであるA
  2. List要素が次のタイプのリストであるAextends Dog
  3. 犬のリストの単一Listのサブタイプを要素とするA
  4. List要素が a の単一サブタイプである a (型のリストextends Dog)
  5. List要素が a の単一スーパータイプである (型のリストextends Dog)
  6. List要素が a の単一サブタイプである a (型のリストsuper Dog)

ここで、「サブタイプ」、「スーパータイプ」、「スーパー」、および「拡張」は「汎用」バージョンです (つまり、境界タイプも含まれます)。


およびサブタイプを使用した例Number。なぜでしょうか。に置き換えDogますNumber

  1. List<List<Number>>Number要素の 2D 配列のように見えるかもしれません。ものすごく単純。

  2. List<List<? extends Number>>各行が数値の異なるサブタイプである 2D 配列のように見える場合があります。たとえば、最初の行はList<Integer>、2 番目の行はList<Double>などです。

  3. List<? extends List<Number>>List<ArrayList<Number>>List<List<Number>>List<LinkedList<Number>>などになる可能性があります。Numberジェネリックは不変であるため、そのままにしておく必要がありますがList、要素の「全体的な」タイプとしてまたはそのサブタイプのいずれかを持つことができます。Listただし、選択できるのは 1 つまたはそのサブタイプのみであり、選択したものを使用する必要があります。

  4. List<? extends List<? extends Number>>に似ていますが、「全体」2D 配列の要素として またはそのサブクラスをList<? extends List<Number>>選択できるようになりました。NumberしたがってList<List<Integer>>List<ArrayList<Integer>>、 、 などを持つことができます。以前と同様に、のサブタイプと のサブタイプのList<LinkedList<Double>>1 つだけを選択できます。ListNumber

  5. (トリッキー! )は 、などList<? super List<? extends Number>>と等価に見えますが、 のサブタイプが使用されている具体的なものではありません。これは、が のスーパータイプと見なされていないためだと思います。これは、ジェネリックが不変であるために意味があると思います。生の型 ( 、など) も機能します。List<List<? extends Number>>List<Collection<? extends Number>> List<List<Number>>NumberList<Number>List<? extends Number>List<Object>List<List>List<Collection>
  6. 4 と同じですが、内部リストとしてList<Number>or List<Object>(そして明らかに) を取得します。List<Serializable>

@MadProgrammer が言ったように、PECS (Producer-Extends-Consumer-Super) により、? extendsジェネリック型の があるときはいつでも、リストを更新できず、そこからアイテムを取得するだけです。だからadd()ノーイングとset()ノーイング。

于 2014-06-13T04:14:54.897 に答える
1

各 "<" を "of" に置き換えます。

「? extends X」がある場合は常に、X の後に「またはそのサブクラスの 1 つ」を挿入します。

于 2014-06-13T04:17:27.860 に答える
1

最初のものは具象的です: それListListの の でありDog、他には何もありません。

2 つ目は、最も内側の宣言で抽象化されています。これは、たとえばから継承するクラスのListです。かもしれません。ListDogPoodleList<ArrayList<Poodle>>

3 番目のものは、内部リスト宣言の抽象です。これは、 -- おそらく-- ofListから継承するある種のコンテナです。それからあなたは持っているかもしれません。ListArrayListDogList<ArrayList<Dog>>

4 番目のものは両方とも抽象的です:Listから派生したある種のコンテナであり、 -- 多分Listから継承した動物で満たされています。DogList<ArrayList<Poodle>>

于 2014-06-13T04:15:55.713 に答える