当前位置: 首页 > 面试题库 >

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

姚实
2023-03-14
问题内容

我在列表上使用通配符和下限泛型,但是编译器抛出错误。

码:

int intStart = 0;       
Number num = new Integer(2);                
List<? super Integer> listOfNumbers = new ArrayList<>();
listOfNumbers.add(intStart);
listOfNumbers.add(num); //throws compiler error

错误:

类型List中的方法add(capture#8-of?super Integer)不适用于参数(Number)

使用List<? super Integer>,应该允许我添加任何类型Integer或其超类型的对象,例如Number或Object。我已经进行了一些SO讨论,但是找不到为什么我应该克服错误。


问题答案:

使用List<? super Integer>,应该允许我html" target="_blank">添加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<? super Integer>会允许该方法接受List<Integer>以及List<Number>,其中任何一个都可以包含一个Integer值。

仅当列表 使用相关 的泛型类型时,此方法才有效。如果该方法尝试从列表中 产生
值,则Object由于我们没有确定的超类型,将被迫假定它们为类型。



 类似资料:
  • 我使用通配符和列表上的下界泛型,但编译器抛出错误。 代码: 错误: 类型列表中的add(capture#8-of?super Integer)方法不适用于参数(Number) 与<代码>列表

  • 问题内容: 如果需要在列表中添加枚举属性,如何声明列表?让我们说枚举类是: 我想要做: 需要用什么代替 问题答案: 如果要使用字符串类型,请使用以下命令: 否则,MByD的答案

  • 我想在java中创建一个哈希表类,将键和值对存储在链表的ArrayList中 然后,我想创建一个链接列表对象,然后可以使用该对象在arrayList的每个索引内创建一个新的链接列表。为此,我声明: 然后我设置了add函数以将元素添加到LinkedList的第一个索引中,该索引位于arrayList的哈希键索引中: 每次运行此代码时,我都会收到一个错误,其中我的索引为7而我的大小为0。这会导致错误:

  • 问题内容: 我有一个关于将子类列表分配给超类列表的基本问题。 所以我有以下内容: 为什么最后一次分配失败?对不起,新手问题 问题答案: 为了解释这一点,让我用整数代替“ B”,用数字代替“ A”。这只是为了使其更容易解释。 失败的原因是因为nList可以采用任何Number;可以采用Integer;可以采用Double;或者就此而言,可以是Number的任何子类。但是,对于iList并非如此。您不

  • 问题内容: 说,我有如下通用类型 我想让它只接受特定的类型(字符串/整数/双精度)。我知道有界通配符,但在这里对我没有帮助。在setVar()中,如果类型不是Integer / String等,我可以检查并引发异常。这是最好的方法吗? 在对此类型进行操作时,我遇到同样的问题。根据类型,我想执行不同的操作。继承和有界通配符似乎通常是解决此类问题的方法,但它们是原始包装器。 问题答案: 使用继承: P

  • 问题内容: 我上课了。我怎么能说我想成为某个班级的实施者?编写根本无法编译。 问题答案: 使用代替。