【问题标题】:Java method parameter gives compilation error "Unexpected bound"Java 方法参数给出编译错误“Unexpected bound”
【发布时间】:2019-05-16 18:10:29
【问题描述】:

在这两种方法中,inspect1 显示编译错误“Unexpected bound”,inspect2 工作正常,为什么?

public <U> void inspect1(List<U extends Number> u){
    System.out.println("T: " + t.getClass().getName());
    System.out.println("U: " + u.getClass().getName());
}

public <U> void inspect2(List<? extends Number> u){
    System.out.println("T: " + t.getClass().getName());
    System.out.println("U: " + u.getClass().getName());
}

【问题讨论】:

  • 当你声明泛型类型U时,你允许所有类型,因为你写的是&lt;U&gt;而不是&lt;U extends Number&gt;。这意味着,假设List&lt;U extends Number&gt; 可以工作是完全不安全的,因为U 可能是Car。您想对类型声明本身进行限制,所以&lt;U extends Number&gt; 然后只使用List&lt;U&gt;。第二个 sn-p 根本不使用 U 类型。因此,列表声明接受每个包含 Number 类型的列表,例如 List&lt;Integer&gt;。

标签: java generics wildcard


【解决方案1】:

为了使它工作,这应该在泛型类型方法签名中定义,说明U可以是Number的子类的任何类型:

public <U extends Number> void inspect1(List<U> u) {
    // body
}

另外,请注意,在第二种方法中,参数U 从未使用过,应如下所示。这表示接受Number 的任何子类列表。不涉及泛型参数U。

public void inspect2(List<? extends Number> u) {
    // body
}

您在答案中提供的这两种方法(inspect1 和 inspect2)之间会有什么区别,还是它们的工作方式完全相同?

他们实际上做同样的事情,因为你不能扩展 Number 并且唯一扩展这个类的类型是(希望我得到了它们):

  • Double、Float、Short、Integer 和 Long

【讨论】:

  • 我认为在inspect2中我们不能在列表u中插入元素,这使得它与inspect1不同。不知何故,我有点忘记了使用上限通配符的功能。您可能需要在答案中编辑此内容。
  • 要校准“inspect2 我们不能在列表 u 中插入元素”,除了 null。
猜你喜欢
  • 1970-01-01
  • 2019-03-26
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多