Java方法参数给出了编译错误“意外界限”

时间:2019-05-16 18:10:29

标签: java generics wildcard

在这两种方法中,inspect1显示编译错误“意外边界”,而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());
}

1 个答案:

答案 0 :(得分:3)

要使其正常工作,应在通用类型方法签名中进行定义,即说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并且扩展此类的唯一类型是它们,所以它们实际上是相同的(希望我都拥有它们):

  • DoubleFloatShortIntegerLong