gpt4 book ai didi

java - 嵌套有界通配符

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:13 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com