嵌套有界通配符

当我尝试编译以下代码时:

LinkedList<List> numList = new LinkedList<List>(); 

我得到一个不兼容的类型错误:

 Required: LinkedList <java.util.list> Found: LinkedList <java.util.list> 

如何实现一个包含List的元素的LinkedList ,其中包含扩展Number元素?

为了清楚numList ,我希望以下列方式向numList添加列表:

numList.add(new LinkedList());

通配符捕获不会超过一个通用级别。 所以虽然这有效:

 LinkedList test = new LinkedList(); 

这不是:

 LinkedList> numList = new LinkedList>(); 

我能想到的最合理的解释是将generics视为最外层的不变量。 LinkedList>不是LinkedList> LinkedList> ,即使ListList List ,原因与List不是List即使DogAnimal 。 在这里, DogAnimal ListList List

好吧,狗/动物解决方案是? extends ? extends

 List animals = new List(); 

应用相同的推理,解决方法是另一个? extends ? extends

 LinkedList> numList = new LinkedList>(); 

但是,由于第一个,您将无法在此列表中添加任何内容? extends ? extends 。 引用类型变量numList不知道List哪个子类型List List它确实是; 它可能是ArrayList ,因此Java无法提供类型安全性,可以将这样的东西添加到这样的LinkedList 。 为了保持类型安全,编译器只允许添加null 。 你必须完全匹配generics类型参数,没有通配符: LinkedList> numList = new LinkedList>(); 。 您可以将List添加到此类LinkedList