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> 

工作得很好,但显然这种集合的使用受到通用集合的通常限制的限制(但是对于更简单的List <?extends Date>也是如此)

假设DB子类型, G是generics类型

 B x = new D(); // OK G y = new G(); // FAIL 

现在, GG的子类型

 G x = new G(); // OK G> y = new G>(); // FAIL 
  

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

 List> ll = new ArrayList>(); 

为您提供类型不匹配的错误,因为您尝试将java类Object的对象List的ArrayList分配给包含任何类型的对象的List ,这些对象是java类Object子类。

有关更多参考,请查看Wildcard文档

当使用非通配符generics类型T分配给变量( List )时,所分配的对象必须具有与其generics类型完全相同的T (包括T所有generics类型参数,通配符和非通配符)。 在你的情况下, TList List ,它与List类型不同。

您可以做什么,因为List可以分配给List List ,是使用通配符类型:

 List> a = new ArrayList>();