在某些地方,通配符和类型参数执行相同的操作。但是在某些地方,你必须使用类型参数。
如果要对不同类型的方法参数强制执行某种关系,则不能使用通配符来实现,而必须使用类型参数。
以你的方法为例,假设你要确保传递给方法的srcand dest列表copy()应为相同的参数化类型,则可以使用如下类型的参数来做到这一点:
public static <T extends Number> void copy(List<T> dest, List<T> src)
在这里,你可以确保
dest和
src都具有相同的参数化类型
List。因此,将元素从复制
src到是安全的
dest。
但是,如果你继续更改使用通配符的方法:
public static void copy(List<? extends Number> dest, List<? extends Number> src)
它不会按预期工作。在第二种情况,你可以通过List
使用通配符和类型参数之间的其他一些区别是:
- 如果只有一个参数化类型参数,则可以使用通配符,尽管类型参数也可以使用。
- 类型参数支持多个范围,通配符不支持。
- 通配符同时支持上限和下限,类型参数仅支持上限。因此,如果要定义一个采用Listtype Integer或它是超类的方法,则可以执行以下操作:
public void print(List<? super Integer> list) // OK
但你不能使用类型参数:
public <T super Integer> void print(List<T> list) // Won't compile



