嵌套有界通配符

vpi*_*mph 9 java generics bounded-wildcard

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

LinkedList<List<? extends Number>> numList = new LinkedList<List<Integer>>();
Run Code Online (Sandbox Code Playgroud)

我得到一个不兼容的类型错误:

Required: LinkedList <java.util.list<? extends java.lang.Number>>
Found: LinkedList <java.util.list<Integer>>
Run Code Online (Sandbox Code Playgroud)

如何实现LinkedList包含具有List扩展元素的元素Number

为了清楚起见,我希望以numList下列方式添加列表:

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

rge*_*man 14

通配符捕获不会超过一个通用级别.所以虽然这有效:

LinkedList<? extends Number> test = new LinkedList<Integer>();
Run Code Online (Sandbox Code Playgroud)

这不是:

LinkedList<List<? extends Number>> numList = new LinkedList<List<Integer>>();
Run Code Online (Sandbox Code Playgroud)

我能想到的最合理的解释是将泛型视为最外层的不变量.A LinkedList<List<Integer>>不是a LinkedList<List<? extends Number>>,即使a List<Integer>是a List<? extends Number>,出于同样的原因a List<Dog>不是a List<Animal>即使a Dog是a Animal.在这里,DogAnimal因为List<Integer>List<? extends Number>.

那么,狗/动物的解决方案是? extends:

List<? extends Animal> animals = new List<Dog>();
Run Code Online (Sandbox Code Playgroud)

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

LinkedList<? extends List<? extends Number>> numList = new LinkedList<List<Integer>>();
Run Code Online (Sandbox Code Playgroud)

但是,由于第一个,您将无法在此列表中添加任何内容? extends.引用类型变量numList不知道它的哪个子类型List<? extends Number>确实存在; 它可能是ArrayList<Integer>,所以Java不能提供类型安全,这样的东西可以添加到这样的LinkedList.为了保持类型安全,编译器只允许添加null.你必须完全匹配泛型类型参数,没有通配符:LinkedList<List<Integer>> numList = new LinkedList<List<Integer>>();.你可以添加一个List<Integer>这样的LinkedList.