您如何用简单的英语描述这些列表内容之间的区别?
我正在寻找可用作参考的简单比较。
/* 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>>
答案 0 :(得分:7)
List
,其元素是狗的列表List
,其元素是extends Dog
List
,其元素是狗列表的单子类型List
,其元素是a的单子类型(extends Dog
的类型列表List
,其元素是单的超类型(extends Dog
的类型列表List
,其元素是a的单子类型(super Dog
的类型列表其中“subtype”,“supertype”,“super”和“extends”是“通用”版本(即还包括边界类型)
Number
和子类型的示例,因为为什么不呢。将Dog
替换为Number
。
List<List<Number>>
可能看起来像是Number
元素的2D数组。非常简单。
List<List<? extends Number>>
可能看起来像一个2D数组,其中每一行都是不同的数字子类型。例如,第一行可能是List<Integer>
,第二行可能是List<Double>
等。
List<? extends List<Number>>
可能是List<ArrayList<Number>>
,List<List<Number>>
,List<LinkedList<Number>>
等等。Number
必须保留,因为泛型是不变的,但是您可以将List
或其任何子类型作为元素的“整体”类型。您只能选择List
或其子类型中的一个,而您选择的那个必须保留。
List<? extends List<? extends Number>>
与List<? extends List<Number>>
类似,但现在您可以选择Number
或其任何子类作为“整体”2D数组的元素。因此,您可以拥有List<List<Integer>>
,List<ArrayList<Integer>>
,List<LinkedList<Double>>
等。与以前一样,您只能选择List
个子类型中的一个和Number
中的一个s亚型。
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>
等)也有效。 List<Collection>
或List<Number>
(显然是List<Object>
)作为内部列表。正如@MadProgrammer所说,由于PECS(Producer-Extends-Consumer-Super),只要你的通用类型有List<Serializable>
,你将无法更新列表,只能从中检索项目它。所以没有? extends
- 没有add()
- ing。
答案 1 :(得分:1)
第一个是具体的:它是List
List
的{{1}},而不是其他任何内容。
第二个是关于最里面的声明的摘要:它是某个类的Dog
个List
继承自List
- 说Dog
。它可能是Poodle
。
第三个是内部列表声明上的抽象:它是某种容器的List<ArrayList<Poodle>>
,它继承自List
- 可能是List
- ArrayList
。然后你可能有Dog
。
第四个是抽象的:它来自List<ArrayList<Dog>>
的某种容器的List
,充满了一些继承自List
的动物 - 也许{{1} }。
答案 2 :(得分:1)
替换每个“&lt;”由“of”。
每当有“?extends X”时,在X之后插入“或其中一个子类”。