通配符捕获的深度不超过一个通用级别。所以虽然这有效:
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>
Dog
Animal
Dog
Animal
List<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
.