这两种类型的泛型函数之间是否有任何隐含的差异,或者编译器是否将它们视为相同?
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) {
}
}
另外,使用其中一个有什么好处吗?
答案 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