Java Generics WildCard:<?扩展数字>与<T 扩展数字>

2022-08-31 12:01:49

这两个函数有什么区别?

static void gPrint(List<? extends Number> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

static <T extends Number> void gPrintA(List<T> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

我看到相同的输出。


答案 1

在这种情况下没有区别,因为永远不会再使用。T

声明的原因是,您可以再次引用它,从而将两个参数类型或一个返回类型绑定在一起。T


答案 2

不同之处在于,使用通配符时无法引用。T

你现在不是,所以“没有区别”,但你可以用它来改变:T

static <T extends Number> T getElement(List<T> l) {
    for (T t : l) {
        if (some condition)
            return t;
    }
    return null;
}

这将返回与传入的任何内容相同的类型,例如,这些都将编译:

Integer x = getElement(integerList);
Float y = getElement(floatList);

推荐