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. AList其元素是狗的列表
  2. AList其元素是一种类型的列表extends Dog
  3. AList其元素是狗列表的单个子类型
  4. AList其元素是 a 的单个子类型(类型列表 that extends Dog
  5. A List,其元素是 a 的单个超类型(类型列表 that extends Dog
  6. AList其元素是 a 的单个子类型(类型列表 that super Dog

其中“subtype”、“supertype”、“super”和“extends”是“通用”版本(即也包括边界类型)


带有和子类型的示例Number,因为为什么不。替换DogNumber

  1. List<List<Number>>可能看起来像一个二维Number元素数组。很简单。

  2. List<List<? extends Number>>可能看起来像一个二维数组,其中每一行都是数字的不同子类型。例如,第一行可能是 a List<Integer>,第二行可能是 a List<Double>,等等。

  3. List<? extends List<Number>>可能是List<ArrayList<Number>>, List<List<Number>>,List<LinkedList<Number>>等。Number必须保留,因为泛型是不变的,但您可以将List其或其任何子类型作为元素的“整体”类型。但是,您只能选择其中一种List或其子类型,而您必须坚持选择的一种。

  4. List<? extends List<? extends Number>>类似于List<? extends List<Number>>,除了现在您可以选择Number它或其任何子类作为“整体”二维数组的元素。所以你可以有List<List<Integer>>, List<ArrayList<Integer>>,List<LinkedList<Double>>等。和以前一样,你只能选择List's 子类型之一和Number's 子类型之一。

  5. 棘手!List<? super List<? extends Number>>似乎等同于List<List<? extends Number>>,List<Collection<? extends Number>>等,但 List<List<Number>>等同于使用子类型的任何具体内容Number。我认为这是因为List<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()-ing 和没有set()-ing。

于 2014-06-13T04:14:54.897 回答
1

将每个“<”替换为“of”。

每当有“?扩展 X”时,在 X 之后插入“或其子类之一”。

于 2014-06-13T04:17:27.860 回答
1

第一个是具体的:它是 a Listof Lists of Dog,仅此而已。

第二个是最内层声明的抽象:它是某个类的 a Listof Lists,它继承自Dog--say Poodle。它可能是一个List<ArrayList<Poodle>>.

第三个是内部列表声明的抽象:它是List某种容器的 a ,它继承自List——也许ArrayList——的Dog. 那么你可能有List<ArrayList<Dog>>.

第四个对两者都是抽象的:它是List某种源自 的容器List,里面装满了某种继承自的动物Dog——也许List<ArrayList<Poodle>>

于 2014-06-13T04:15:55.713 回答