首页 > 解决方案 > 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){

        }

    }
}

标签: javagenerics

解决方案


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

第一个片段说:有一些类型;我们对其进行限制,使其成为其中的一个java.lang.Number或某个子类型。然后,这种类型出现了两次:一次作为列表上的类型参数(所以,它是一个数字列表,或者一个整数列表,或者一个双精度列表等),一次作为变量的类型,当我们遍历列表中的每个元素。关于 t 变量,你所能知道的for (T t : list)只是它至少是,java.lang.Number但你知道的就是这些。

在第二个片段中,您说:我们有一个列表,其中包含其中一个java.lang.Number或任何子类型。我们对这个列表所做的只是迭代它,此时可以声明你可以确定当你迭代这个列表时掉出的项目至少是一个java.lang.Number.

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


推荐阅读