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

泛型通配符有界类型vs泛型有界类型参数[重复]

郤坚诚
2023-03-14

在了解Java泛型的过程中,我遇到了以下问题:

public static <T extends Number> int sumListElems(List<T> list){
   int total = 0;
   for(Number n: list)
       total += n.intValue();
   return total;
}

假设我有下面的方法来添加列表的元素,只限于包含数字的列表。

但是这段代码和这段代码有什么不同:

public static int sumListElems(List<? extends Number> list){
   int total = 0;
   for(Number n: list)
      total += n.intValue();
   return total;
}

它们都按预期编译和执行。这两者之间有什么区别?除了语法之外?什么时候我更喜欢使用通配符而不是前者?

是的,使用通配符方法,我不能在列表中添加除null之外的新元素,否则它将无法编译。除此之外呢?

共有1个答案

闻人凯泽
2023-03-14

这种情况下没有区别。对于更复杂的签名,您可能需要重用定义的类型,因此需要定义它。类似于:

public static <T extends Number> void foo(T bar, List<T> myList)...

这不仅保证了barmyList元素都扩展了Number,而且它们是相同类型的。您不能用其他语法强制执行它。

 类似资料:
  • 根据Joshua Bloch的“有效Java”一书,关于如何/何时在泛型中使用有界通配符有一个规则。这个规则就是PECS(productor-extends,Comsumer-Super)。当我研究以下示例时: 根据PECS规则,上述声明是错误的。但是我希望有一个的,并向这个传递一个。为什么不做呢? 为什么要始终使用关键字?为什么使用是错误的? 当然,这也代表了Comsumer的观点。为什么消费者

  • 我正在与Java8通配符泛型作斗争。 假设一个名为的泛型类(来自Core Java book) 是因为Java8编译器转换吗?超级经理反对,因此任何事情都是允许的?

  • 我正在刷新我关于Java泛型的知识。所以我转向甲骨文的优秀教程...并开始为我的同事准备一个演示文稿。我在教程中遇到了通配符部分,上面写着: 考虑以下方法,打印列表: printList的目标是打印任何类型的列表,但它无法实现该目标-它只打印对象实例的列表;无法打印列表 我明白那个

  • 我有一个典型的问题,什么是更好的,我认为答案总是视情况而定,但我还是想澄清一下。所以有两种方法: 逻辑是: 我知道由于类型擦除,方法签名存在冲突,所以我的问题不是“为什么我不能同时拥有这两个方法?”,而是“你会选择哪种方法?”。

  • 问题内容: 以下两个签名是否相同? 和 问题答案: 不,两个签名不相同。根据Java语言规范的第8章: 如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。 如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型: 它们具有相同数量的形式参数(可能为零) 它们具有相同数量的类型参数 (可能为零) … 由于两种方法共享的类型参数数量不同,因此签名也不相同。 在实际情况下,使用

  • 问题内容: 最近,我读了这篇文章:http : //download.oracle.com/javase/tutorial/extra/generics/wildcards.html 我的问题是,而不是创建像这样的方法: 我可以创建一个这样的方法,它可以正常工作: 我应该使用哪种方式?通配符在这种情况下有用吗? 问题答案: 这取决于您 需要 做什么。如果要执行以下操作,则需要使用bounded t