gpt4 book ai didi

java - 嵌套有界通配符

转载 作者:太空宇宙 更新时间:2023-11-04 15:22:50 26 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>即使 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/

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