Java泛型,嵌套的通配符集合

时间:2011-06-09 13:53:18

标签: java generics wildcard

这编译(1.6)

List<? extends Object> l = new ArrayList<Date>();

但这不是

List<List<? extends Object>> ll = new ArrayList<List<Date>>();

错误

Type mismatch: cannot convert from ArrayList<List<Date>> to List<List<? extends Object>>

有人可以解释原因吗? 感谢

编辑:编辑后续

5 个答案:

答案 0 :(得分:15)

这些解释是正确的,但我认为添加实际工作解决方案也是一件好事;)

List<? extends List<? extends Object>>

工作得很好,但显然这种集合的使用受到通用集合的通常限制的限制(但对于更简单的List&lt;?extends Date&gt;同样如此)

答案 1 :(得分:12)

因为它会打破类型安全:

List<List<Object>> lo = new ArrayList<List<Object>>();
List<List<? extends Object>> ll = lo;
List<String> ls = new ArrayList<String>();
ll.add(ls);
lo.get(0).add(new Object());
String s = ls.get(0); // assigns a plain Object instance to a String reference

答案 2 :(得分:3)

假设DB的子类型,G<T>是通用类型

B x = new D(); // OK

G<B> y = new G<D>(); // FAIL

现在,G<Date>G<?>的子类型,因此

G<?> x = new G<Date>();  // OK

G<G<?>> y = new G<G<Date>>(); // FAIL

答案 3 :(得分:1)

使用非通配符泛型类型List<T>分配变量(T)时,所分配的对象必须具有与其通用类型完全相同的T(包括所有泛型类型参数) T,通配符和非通配符)。在您的情况下,TList<? extends Object>,与List<Date>的类型不同。

您可以执行的操作,因为List<Date>可分配给List<? extends Object>,使用通配符类型:

List<? extends List<? extends Object>> a = new ArrayList<List<Date>>();

答案 4 :(得分:0)

<? extends Object>  

表示通配符只能替换为Object类的子类的那些对象。

List<List<? extends Object>> ll = new ArrayList<List<Object>>();  

为您提供类型不匹配的错误,因为您尝试将ArrayList的java类Object对象列表分配给包含任何List的{​​{1}}作为java类List的子类的对象类型。

如需更多参考,请查看Wildcard documentation