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