嵌套有界通配符
当我尝试编译以下代码时:
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 extends Number> test = new LinkedList();
这不是:
LinkedList> numList = new LinkedList>();
我能想到的最合理的解释是将generics视为最外层的不变量。 LinkedList
不是>
LinkedList
>
LinkedList
,即使>
List
是List extends Number>
List extends Number>
,原因与List
不是List
即使Dog
是Animal
。 在这里, Dog
是Animal
List
是List extends Number>
List extends Number>
。
好吧,狗/动物解决方案是? extends
? extends
:
List extends Animal> animals = new List();
应用相同的推理,解决方法是另一个? extends
? extends
:
LinkedList extends List extends Number>> numList = new LinkedList>();
但是,由于第一个,您将无法在此列表中添加任何内容? extends
? extends
。 引用类型变量numList
不知道List extends Number>
哪个子类型List extends Number>
List extends Number>
它确实是; 它可能是ArrayList
,因此Java无法提供类型安全性,可以将这样的东西添加到这样的LinkedList
。 为了保持类型安全,编译器只允许添加null
。 你必须完全匹配generics类型参数,没有通配符: LinkedList
。 您可以将> numList = new LinkedList
List
添加到此类LinkedList
。