java – 嵌套有界通配符

前端之家收集整理的这篇文章主要介绍了java – 嵌套有界通配符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我尝试编译下面的代码
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,其中包含具有扩展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<?扩展Number>>尽管List< Integer>是列表<?由于与List< Dog>相同的原因,扩展了Number>不是列表<动物>即使狗是动物.这里,狗是动物列表<整数>是列出<?扩展编号>.

那么狗/动物的解决方案是?延伸:

List<? extends Animal> animals = new List<Dog>();

应用相同的推理,解决方法是另一个?延伸:

LinkedList<? extends List<? extends Number>> numList = new LinkedList<List<Integer>>();

但是,由于第一个,您将无法添加到此列表中的任何内容?延伸.引用类型变量numList不知道List的子类型扩展号>真的是它可以是ArrayList< Integer>,所以Java不能提供类似的安全性,这样的事情可以被添加到这样的LinkedList.为了保持类型的安全性,编译器将只允许添加null.您必须完全匹配通用类型参数,没有通配符:LinkedList< List< Integer>> numList = new LinkedList< List< Integer>>();.您可以添加列表<整数>到这样一个LinkedList.

猜你在找的Java相关文章