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

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

泛型不允许将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
由于我们没有确定的超类型,将被迫假定它们为类型。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5488509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存