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
.在这里,Dog
是Animal
因为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
.