有人可以帮助我理解m1()和m2()泛型方法之间的区别。
class C1 {
<T extends Number> void m1(List<T> list){
System.out.println(list);
for (T t : list){
System.out.println(t);
}
}
void m2(List<? extends Number> list){
for(Number n :list){
}
}
}
答案 0 :(得分:1)
这两个片段之间没有功能上的区别。它们执行相同的操作,具有同等的灵活性,具有相同的签名,并且基本上可以编译为精确的相同类文件。
第一个片段说:有某种类型;我们对其进行限制,使其为java.lang.Number
或其某些子类型。然后,此类型显示两次:一次作为列表上的类型参数(因此,它是数字列表,整数列表或双精度列表等),一次作为变量的类型,遍历列表中的每个元素。您可以了解的for (T t : list)
中的t变量至少是java.lang.Number
,但这就是您所知道的。
在第二个片段中,您说:我们有java.lang.Number
或其任何子类型的列表。我们使用此列表进行的所有操作都是对其进行迭代,此时可以声明,可以确保遍历此列表时掉出的项至少为java.lang.Number
。
在两种情况下,循环变量(第一个片段中的T t
,第二个片段中的Number n
)都绑定为java.lang.Number
,并且可以用作数字。