这编译(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>>
有人可以解释原因吗? 感谢
编辑:编辑后续
答案 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)
假设D
是B
的子类型,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
,通配符和非通配符)。在您的情况下,T
为List<? 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