在这两种方法中,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());
}
答案 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
并且扩展此类的唯一类型是它们,所以它们实际上是相同的(希望我都拥有它们):
Double
,Float
,Short
,Integer
和Long