Java中m1和m2泛型方法的区别



有人可以帮助我理解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){
}
}
}

这两个片段之间没有功能差异。它们做同样的事情,同样灵活,具有相同的签名,并且基本上编译为完全相同的类文件。

第一个片段说:有某种类型;我们限制它,以便它是java.lang.Number或其某种子类型。然后,此类型出现两次:一次作为列表中的类型参数(因此,它是数字列表,整数列表,或双精度列表等(,一次作为变量的类型,当我们循环访问列表中的每个元素时。关于for (T t : list)中的 t 变量,您所能知道的只是它至少是java.lang.Number但这就是您所知道的。

在第二个片段中,你说:我们有一个java.lang.Number或其任何子类型的列表。我们对这个列表所做的只是遍历它,此时可以声明您可以确定在循环访问此列表时掉落的项目至少是一个java.lang.Number.

在这两种情况下,循环 var(第一个代码段中T t,第二个片段中Number n(都绑定为java.lang.Number,可以用作数字。

最新更新