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>即使 Dog是一个 Animal .在这里,DogAnimal作为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/

相关文章:

C# 语言 : How to get type of bound but open Generic class?

java - java中的通配符只适用于集合吗?

java - 为什么使用通配符调用 Enum.valueOf() 时会出现绑定(bind)不匹配错误

java - 将图像裁剪得更大

java - 性能偏执狂 : how much expensive are Float. parseFloat(String), Integer.parseInt(String)?

java - 从java中的接口(interface)实现泛型方法

c# - 没有 OrderedDictionary 的通用实现?

java - Tomcat 与 Hibernate 的池化问题。 MySQL超时

java - 如何在Android项目中使用SoundCloud API?

java - 有界通配符和类型参数有什么区别?