栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

泛型不允许将A的超级类型添加到列表中

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

泛型不允许将A的超级类型添加到列表中

使用

List<? super Integer>
,应该允许我添加Integer类型或其超类型的任何对象,例如Number或Object。

不对

List<? super Integer>
并不意味着 可以容纳Integer的任何超类型的列表 。这意味着 其泛型可能是
Integer的某些 特定
超类型的列表

。因此,它实际上可能是
List<Object>
List<Number>
List<Integer>
。所有这些列表类型都可以包含一个
Integer
,但不能说相同
Number
。一个
Number
可能是一个
Double
或一
Long
,这是不是在允许的
List<Integer>

为了更具体一点,请考虑以下代码段:

Long longValue = 2L;List<Integer> listOfIntegers = new ArrayList<>();// listOfIntegers.add(longValue);

带注释的行显然不应该编译,也不应该编译。但是,如果我们添加以下内容呢?

Number longAsNumber = longValue;List<? super Integer> listOfSuper = listOfIntegers;listOfSuper.add(longAsNumber);

这相当于您的问题中的代码段。最后一行应该编译吗?如果这样,它将违反的通用不变式

List<Integer>


根据您的评论,

List<? super Integer>
在您的示例中确实是不必要的。更常见的情况是为方法参数增加灵活性。例如一种方法

void addInt(List<Integer> list) {    list.add(1);}

将只能接受

List<Integer>
,这将是不必要的限制。将参数类型更改为
List<? superInteger>
会允许该方法接受
List<Integer>
以及
List<Number>
,其中任何一个都可以包含一个
Integer
值。

仅当列表 使用相关 的泛型类型时,此方法才有效。如果该方法尝试从列表中 产生
值,则

Object
由于我们没有确定的超类型,将被迫假定它们为类型。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496388.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号