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

时间:2019-12-19 23:03:19

标签: java generics

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

        }

    }
}

1 个答案:

答案 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,并且可以用作数字。