- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我尝试编译以下代码时:
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
的元素带有扩展 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<? extends Number>>
,即使是 List<Integer>
是 List<? extends Number>
, 出于同样的原因 List<Dog>
不是 List<Animal>
即使 Dog
是一个 Animal
.在这里,Dog
是Animal
作为List<Integer>
是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
.
关于java - 嵌套有界通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20204918/
我是一名优秀的程序员,十分优秀!