这些通用声明之间有什么区别?

时间:2014-06-13 04:10:23

标签: java generics nested-generics

您如何用简单的英语描述这些列表内容之间的区别?

我正在寻找可用作参考的简单比较。

/* 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>>

相关问题&amp;资源

3 个答案:

答案 0 :(得分:7)

  1. 一个List,其元素是狗的列表
  2. List,其元素是extends Dog
  3. 类型的列表
  4. 一个List,其元素是狗列表的子类型
  5. 一个List,其元素是a的子类型(extends Dog的类型列表
  6. 一个List,其元素是的超类型(extends Dog的类型列表
  7. 一个List,其元素是a的子类型(super Dog的类型列表
  8. 其中“subtype”,“supertype”,“super”和“extends”是“通用”版本(即还包括边界类型)


    Number和子类型的示例,因为为什么不呢。将Dog替换为Number

    1. List<List<Number>>可能看起来像是Number元素的2D数组。非常简单。

    2. List<List<? extends Number>>可能看起来像一个2D数组,其中每一行都是不同的数字子类型。例如,第一行可能是List<Integer>,第二行可能是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或其任何子类作为“整体”2D数组的元素。因此,您可以拥有List<List<Integer>>List<ArrayList<Integer>>List<LinkedList<Double>>等。与以前一样,您只能选择List个子类型中的一个和Number中的一个s亚型。

    5. 棘手!List<? super List<? extends Number>>似乎等同于List<List<? extends Number>>List<Collection<? extends Number>>等,但不是 {{1使用List<List<Number>>子类型的任何具体内容。我认为这是因为Number不被认为是List<Number>的超类型,我认为由于泛型不变而有意义。 List<? extends Number>以及原始类型(List<Object>List<List>等)也有效。
    6. 与4相同,只是您将List<Collection>List<Number>(显然是List<Object>)作为内部列表。

    7. 正如@MadProgrammer所说,由于PECS(Producer-Extends-Consumer-Super),只要你的通用类型有List<Serializable>,你将无法更新列表,只能从中检索项目它。所以没有? extends - 没有add() - ing。

答案 1 :(得分:1)

第一个是具体的:它是List List的{​​{1}},而不是其他任何内容。

第二个是关于最里面的声明的摘要:它是某个类的DogList继承自List - 说Dog。它可能是Poodle

第三个是内部列表声明上的抽象:它是某种容器的List<ArrayList<Poodle>>,它继承自List - 可能是List - ArrayList 。然后你可能有Dog

第四个是抽象的:它来自List<ArrayList<Dog>>的某种容器的List,充满了一些继承自List的动物 - 也许{{1} }。

答案 2 :(得分:1)

替换每个“&lt;”由“of”。

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