括号内的Java泛型方法参数类型与外部括号

Paz*_*Paz 22 java generics

之间有什么区别:

static void findMax(LinkedList<? extends Number> list){...}
Run Code Online (Sandbox Code Playgroud)

和:

static <T extends Number> void findMax(LinkedList<T> list){...}
Run Code Online (Sandbox Code Playgroud)

既然两者都有效,我想知道两者之间是否有任何重大差异,建议采用哪种方法.

ass*_*ias 14

主要区别在于,在第二个版本中,您可以访问该类型,T而在第一个版本中您不能访问.

例如,您可能希望返回链接到T的内容(例如,返回T而不是void):

static <T extends Number> T findMax(LinkedList<T> list){...}
Run Code Online (Sandbox Code Playgroud)

或者您可能需要创建一个新的Ts列表:

static <T extends Number> void findMax(LinkedList<T> list){
    List<T> copyAsArrayList = new ArrayList<> (list);
    //do something with the copy
}
Run Code Online (Sandbox Code Playgroud)

如果您不需要访问权限T,则两个版本在功能上都是等效的.


dar*_*jan 10

如果您只关心findMax接受符合特定条件的列表(在您的情况下是扩展的类型列表),则应使用第一个Number.

static Number findMax(LinkedList<? extends Number> list) {
    Number max = list.get(0);
    for (Number number : list) {
        if (number > max) {
            max = number;
        }
    }
    return max;
}
Run Code Online (Sandbox Code Playgroud)

此方法返回Number.例如,如果您有自己的类,Number并且有一些特殊的方法,您希望稍后在此方法的结果上使用,则可能会出现问题.


当您计划T在方法体中使用精确类型,方法参数或方法的返回类型时,应使用第二个.

static <T extends Number> T findMax(LinkedList<T> list, T currentMax) {
    T max = currentMax;
    for (T number : list) {
        if (number > max) {
            max = number;
        }
    }
    return max;
}
Run Code Online (Sandbox Code Playgroud)

结论:

在功能上,它们几乎相同,只是具有未知类型(?)的列表无法修改.