9

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

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包含List与扩展元素是 s 的元素Number

需要明确的是,我希望以numList下列方式添加列表:

numList.add(new LinkedList<Integer>());

4

1 回答 1

14

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

LinkedList<? extends Number> test = new LinkedList<Integer>();

这不会:

LinkedList<List<? extends Number>> numList = new LinkedList<List<Integer>>();

我能想到的最合理的解释是认为泛型在最外层是不变的。ALinkedList<List<Integer>>不是 a LinkedList<List<? extends Number>>,即使 aList<Integer>是 a List<? extends Number>,出于同样的原因,即使a 是 a , aList<Dog>也不是a 。在这里,is to as is to 。List<Animal>DogAnimalDogAnimalList<Integer>List<? extends Number>

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

List<? extends Animal> animals = new List<Dog>();

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

LinkedList<? extends List<? extends Number>> numList = new LinkedList<List<Integer>>();

但是,由于第一个? extends. 引用类型变量numList不知道它List<? extends Number>到底是哪个子类型;可能是ArrayList<Integer>这样,所以 Java 无法提供可以将这样的东西添加到这样的LinkedList. 为了维护类型安全,编译器将只允许添加null. 您必须完全匹配泛型类型参数,没有通配符:LinkedList<List<Integer>> numList = new LinkedList<List<Integer>>();。您可以将 a 添加List<Integer>到这样的LinkedList.

于 2013-11-25T22:42:59.283 回答