当前位置: 首页 > 知识库问答 >
问题:

仿制药不允许将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

错误:

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

与<代码>列表

共有2个答案

狄卓君
2023-03-14

列表

简而言之,当使用列表时

(为了进一步阅读,这个答案对这个问题的泛型给出了非常详细的解释)

江宏深
2023-03-14

与<代码>列表

这是不正确的。List

为了让它更具体一些,请考虑这个片段:

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

注释行显然不应该编译,也不应该编译。但是如果我们加上这个:

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

这相当于你问题中的片段。最后一行应该编译吗?如果会,它将违反List的通用不变量

作为对您评论的回应,List

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

只能接受List

这仅在列表使用相关泛型类型时有效。如果该方法试图从列表中生成值,它将被迫假定它们是Object类型,因为我们没有确定的超类型。有关更多信息,请参阅什么是PECS(生产者延伸消费者超级)?

 类似资料:
  • 问题内容: 我在列表上使用通配符和下限泛型,但是编译器抛出错误。 码: 错误: 类型List中的方法add(capture#8-of?super Integer)不适用于参数(Number) 使用,应该允许我添加任何类型或其超类型的对象,例如Number或Object。我已经进行了一些SO讨论,但是找不到为什么我应该克服错误。 问题答案: 使用,应该允许我添加Integer类型或其超类型的任何对象

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

  • 虽然我确实理解泛型的一些常见情况,但我在下面的例子中遗漏了一些东西。 我有以下课程 第4行给出了错误 显然,编译器认为不同的并不真正相等。而我的直觉告诉我,这是正确的。 如果第4行是合法的,谁能提供一个我会得到运行时错误的例子? 编辑: 为了避免混淆,我用一个具体的赋值替换了第3行中的

  • 这可能是一个复制品。但是经过一天的研究,我希望你能宽大处理。这是一个关于协方差的问题。 为什么我能这么做? 但不能这样做吗? 我读了一些关于协方差的讨论。 “C#中的协方差” “将列表转换为接口列表” “转换列表到接口列表” 我的理解是,我不能将狗的名单添加到动物名单中,因为这样我就可以将猫添加到动物名单中,这将是危险的。但是在动物列表中添加一个猫或狗的例子也同样危险,不是吗?在我看来,C#还没有

  • 问题内容: 我有一个要添加位列的表,对于所有现有数据,我希望将其默认设置为false。 如何更改表,使其在为现有行插入false之前可以指定NOT NULL? 我是否应该将其创建为可为空,而不是将其切换为不可为空? 问题答案: 您可以添加该列并提供用于所有现有行的默认值。

  • 问题内容: 我正在尝试模拟Spring Rest 的方法。 在同一测试中,我有多个调用,它们的区别仅在于返回类型。 这是我创建的模拟方法 第一 第二 模拟不考虑的通用参数,最后定义的模拟胜过前者。 有什么办法可以使其工作? 问题答案: Mockito并不擅长匹配泛型本身,但是您的解决方案比一般情况要容易得多。 更换: 与: 首先,不匹配类型,甚至不匹配类型(从Mockito 1.x开始)。匹配所有