嵌套有界通配符

2023-11-21

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

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其中包含的元素是Lists 具有扩展元素Number?

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

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


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

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

这不会:

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

我能想到的最合理的解释是认为泛型在最外层是不变的。 ALinkedList<List<Integer>>不是一个LinkedList<List<? extends Number>>,尽管一个List<Integer> is a List<? extends Number>,出于同样的原因,List<Dog>不是一个List<Animal>即使一个Dog is an Animal。这里,Dog is to Animal as List<Integer> is to 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>>();。您可以添加一个List<Integer>到这样一个LinkedList.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套有界通配符 的相关文章

随机推荐