Javagenerics,嵌套的通配符集合
编译(1.6)
List l = new ArrayList();
但事实并非如此
List<List> ll = new ArrayList<List>();
有错误的
Type mismatch: cannot convert from ArrayList<List> to List<List>
有人可以解释原因吗? 谢谢
编辑:编辑为后续
因为它会打破类型安全:
List> lo = new ArrayList>(); List> ll = lo; List ls = new ArrayList (); ll.add(ls); lo.get(0).add(new Object()); String s = ls.get(0); // assigns a plain Object instance to a String reference
那么解释是正确的,但我认为添加实际的工作解决方案也是一件好事;)
List extends List extends Object>>
工作得很好,但显然这种集合的使用受到通用集合的通常限制的限制(但是对于更简单的List <?extends Date>也是如此)
假设D
是B
子类型, G
是generics类型
B x = new D(); // OK G y = new G(); // FAIL
现在, G
是G>
的子类型
G> x = new G(); // OK G> y = new G>(); // FAIL
extends Object>
表示通配符只能替换为Object
类的子类的那些对象。
List> ll = new ArrayList>();
为您提供类型不匹配的错误,因为您尝试将java类Object
的对象List的ArrayList
分配给包含任何类型的对象的List
,这些对象是java类Object
子类。
有关更多参考,请查看Wildcard文档
当使用非通配符generics类型T
分配给变量( List
)时,所分配的对象必须具有与其generics类型完全相同的T
(包括T
所有generics类型参数,通配符和非通配符)。 在你的情况下, T
是List extends Object>
List extends Object>
,它与List
类型不同。
您可以做什么,因为List
可以分配给List extends Object>
List extends Object>
,是使用通配符类型:
List extends List extends Object>> a = new ArrayList>();