有一些地方,通配符和类型参数做同样的事情。但也有一些地方,你必须使用类型参数。
>如果你想对不同类型的方法参数执行一些关系,你不能使用通配符,你必须使用类型参数。
以你的方法为例,假设你想确保传递给copy()方法的src和dest列表应该是相同的参数化类型,你可以使用类型参数,如:
public static void copy(List dest, List src)
在这里,您确保dest和src具有相同的参数化类型为List。因此,可以安全地将元素从src复制到dest。
但是,如果你继续改变方法使用通配符:
public static void copy(List extends Number> dest, List extends Number> src)
它将无法正常工作。在第二种情况下,可以传递List< Integer>和List< Float>作为dest和src。所以,将元素从src移动到dest将不再是类型安全了。
如果你不需要这种关系,那么你可以自由地不使用类型参数。
使用通配符和类型参数之间的其他一些区别是:
>如果你只有一个参数化类型参数,那么你可以使用通配符,虽然类型参数也会工作。
>类型参数支持多个边界,通配符不支持。
>通配符支持上限和下限,类型参数只支持上限。因此,如果要定义一个接受类型为Integer的List或其超类的方法,您可以:
public void print(List super Integer> list) // OK
但是你不能使用类型参数:
public void print(List list) // Won't compile
参考文献: