当我尝试编译以下代码时:
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>());
通配符捕获的深度不会超过一层通用级别。所以虽然这有效:
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(使用前将#替换为@)