这两个功能有什么区别?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我看到相同的输出.
Thi*_*ilo 42
在这种情况下没有区别,因为T从未再次使用过.
声明a的原因T是您可以再次引用它,从而将两个参数类型或返回类型绑定在一起.
Boh*_*ian 42
不同之处在于您T在使用通配符时无法参考.
你现在不是,所以"没有区别",但是你可以用这些T来改变它们:
static <T extends Number> T getElement(List<T> l) {
for (T t : l) {
if (some condition)
return t;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
这将返回与传入的任何类型相同的类型.例如,这些将编译:
Integer x = getElement(integerList);
Float y = getElement(floatList);
Run Code Online (Sandbox Code Playgroud)
T是一种有界类型,即你使用的任何类型,你必须坚持扩展的特定类型Number,例如,如果你将Double类型传递给列表,你不能传递Short类型T的类型Double,并且列表已经受到限制类型.相反,如果你使用?(wildcard),您可以使用"任何"类型的扩展Number(同时添加Short并Double到该列表).
| 归档时间: |
|
| 查看次数: |
14511 次 |
| 最近记录: |