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.