java - 嵌套有界通配符

标签 java generics bounded-wildcard

当我尝试编译以下代码时:

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>即使 DogAnimal 。在这里,DogAnimalList<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/20233169/

相关文章:

java - Java中的无界通配符

java - 将 JDBC 更改为 hibernate 后,应用程序运行速度非常慢

java - 在构造函数中启动线程

java - java数组的基本for循环操作?

java - 调用通用方法java的编译器错误

.net - 如何为通用接口(interface)编写 native 模板化后备存储?

c# - 如何知道基类中的派生类

java - Java 中的通配符 Generic 和 <? super T> 意思,下界或上界

java - 如何使用 postgis 和 hibernate-spatial 正确映射多边形类型?

Java:帮助我理解:如何在有界通配符字段上使用接口(interface)方法?