何时使用通用方法,何时使用通配符?
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c);}
我们本可以在这里使用通用方法,而不是: interface Collection<E> { public <T> boolean containsAll(Collection<T> c); public <T extends E> boolean addAll(Collection<T> c); // Hey, type variables can have bounds too!}
[…]这告诉我们,类型参数用于多态性;它的唯一效果是允许在不同的调用站点上使用各种实际的参数类型。如果是这样的话,应该使用通配符。通配符是为了支持灵活的子类型而设计的,这正是我们在这里试图表达的。
(Collection<? extends E> c);
泛型方法允许使用类型参数来表示方法和/或其返回类型的一个或多个参数类型之间的依赖关系。如果不存在这种依赖关系,则不应该使用泛型方法。
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ...}[…]
我们可以用另一种方式编写此方法的签名,而无需使用通配符: class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ...}
HUWWW
四季花海
冉冉说
相关分类