有人能帮我理解一下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){
}
}
}发布于 2019-12-20 07:20:35
这两个代码片段在功能上没有区别。它们做同样的事情,同样灵活,具有相同的签名,并且基本上编译成完全相同的类文件。
第一个代码片段说:有一些类型;我们限制它为java.lang.Number或它的某个子类型。然后,这个类型出现了两次:一次是作为列表上的类型参数(所以,它是一个数字列表,或者是一个整数列表,或者是一个双精度列表,等等),另一次是当我们迭代列表中的每个元素时,作为变量的类型。关于for (T t : list)中的t变量,您所能说的就是它至少是java.lang.Number,但这就是您所知道的全部。
在第二个代码片段中,您可以说:我们有一个包含java.lang.Number或其任何子类型的列表。我们对这个列表所做的就是遍历它,这时可以声明,当您遍历这个列表时,您可以确定掉出来的项至少是一个java.lang.Number。
在这两种情况下,循环变量(第一个代码段中的T t,第二个代码段中的Number n )被绑定为java.lang.Number,并且可以用作一个数字。
https://stackoverflow.com/questions/59417961
复制相似问题