- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我尝试编译以下代码时:
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/20233169/
我是一名优秀的程序员,十分优秀!