当我尝试编译下面的代码:
LinkedList<List<? extends Number>> numList = new LinkedList<List<Integer>>();
我得到一个不兼容的类型错误:
required: LinkedList <java.util.list<? extends java.lang.Number>> Found: LinkedList <java.util.list<Integer>>
如何实现一个LinkedList,其中包含具有扩展Number的元素的列表的元素?
要清楚,我正在寻找以下列方式添加列表到numList:
numList.add(new LinkedList< Integer>());
解决方法
通配符捕获不会超过一个通用级别.所以虽然这样做:
LinkedList<? extends Number> test = new LinkedList<Integer>();
这不是:
LinkedList<List<? extends Number>> numList = new LinkedList<List<Integer>>();
我可以想到的最合理的解释就是将泛型看作最外层的不变量.一个LinkedList< List< Integer>>>不是LinkedList< List<?扩展Number>>尽管List< Integer>是列表<?由于与List< Dog>相同的原因,扩展了Number>不是列表<动物>即使狗是动物.这里,狗是动物列表<整数>是列出<?扩展编号>.
那么狗/动物的解决方案是?延伸:
List<? extends Animal> animals = new List<Dog>();
应用相同的推理,解决方法是另一个?延伸:
LinkedList<? extends List<? extends Number>> numList = new LinkedList<List<Integer>>();
但是,由于第一个,您将无法添加到此列表中的任何内容?延伸.引用类型变量numList不知道List的子类型扩展号>真的是它可以是ArrayList< Integer>,所以Java不能提供类似的安全性,这样的事情可以被添加到这样的LinkedList.为了保持类型的安全性,编译器将只允许添加null.您必须完全匹配通用类型参数,没有通配符:LinkedList< List< Integer>> numList = new LinkedList< List< Integer>>();.您可以添加列表<整数>到这样一个LinkedList.