java – 嵌套有界通配符
当我尝试编译下面的代码:
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,其中包含具有扩展Number的元素的列表的元素? 要清楚,我正在寻找以下列方式添加列表到numList: numList.add(new LinkedList< Integer>()); 解决方法
通配符捕获不会超过一个通用级别.所以虽然这样做:
LinkedList<? extends Number> test = new LinkedList<Integer>(); 这不是: LinkedList<List<? extends Number>> numList = new LinkedList<List<Integer>>(); 我可以想到的最合理的解释就是将泛型看作最外层的不变量.一个LinkedList< List< Integer>>>不是LinkedList< List<?扩展Number>>尽管List< Integer>是列表<?由于与List< Dog>相同的原因,扩展了Number>不是列表<动物>即使狗是动物.这里,狗是动物列表<整数>是列出<?扩展编号>. 那么狗/动物的解决方案是?延伸: List<? extends Animal> animals = new List<Dog>(); 应用相同的推理,解决方法是另一个?延伸: LinkedList<? extends List<? extends Number>> numList = new LinkedList<List<Integer>>(); 但是,由于第一个,您将无法添加到此列表中的任何内容?延伸.引用类型变量numList不知道List的子类型扩展号>真的是它可以是ArrayList< Integer>,所以Java不能提供类似的安全性,这样的事情可以被添加到这样的LinkedList.为了保持类型的安全性,编译器将只允许添加null.您必须完全匹配通用类型参数,没有通配符:LinkedList< List< Integer>> numList = new LinkedList< List< Integer>>();.您可以添加列表<整数>到这样一个LinkedList. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |