这两个通用函数之间的区别

时间:2017-06-30 14:08:22

标签: java list generics difference

这两种类型的泛型函数之间是否有任何隐含的差异,或者编译器是否将它们视为相同?

public static <T extends Number> void test(List<T> list) {
    for (T t : list) {

    }
}

对战

public static void test(List<? extends Number> list) {
    for (Number t : list) {

    }
}

另外,使用其中一个有什么好处吗?

1 个答案:

答案 0 :(得分:3)

这些在功能上是相同的。所以第二个应该更喜欢更短:

public static <T extends Number> List<T> test(List<T> list) {
    for (T t : list) {

    }
    return list;
}

当你想要返回依赖于声明类型的东西时,第一个更有意义。

例如,此代码在返回类型方面更灵活:

List<Integer> integers = ...;
integers = test(integers);

你可以用这种方式调用它:

List<Integer>

因为在返回类型中使用了声明的参数化类型,编译器会根据您分配方法结果的变量类型推断返回类型(当然必须与类型约束兼容)。 / p>

但由于List<? extends Number>List<Integer> integers = ...; List<? extends Number> numbers = test(integers); 的子类型,您也可以这样使用:

List<? extends Number>

如果不在List的返回类型中声明参数化类型,则只能将方法的结果分配给使用public static List<? extends Number> test(List<? extends Number> list) { for (Number t : list) { } return list; } 声明的类型:

List<Integer> integers = ...;
List<? extends Number> numbers = test(integers);

所以,只有这种方式才有效:

def authorize():
    def wrapper(func):
        @asyncio.coroutine
        @functools.wraps(func)
        def wrapped(*args):
            allowed = # Some auth stuff
            if not allowed:
                return HTTPUnauthorized()
            return yield from func()
        return wrapped
    return wrapper