【发布时间】:2022-01-20 02:37:43
【问题描述】:
我正在阅读来自OracleDocGenericMethod 的泛型方法。当它说何时使用通配符以及何时使用泛型方法时,我对比较感到非常困惑。 引用自文档。
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) { ... }
该文件不鼓励使用第二个声明并提倡使用第一个语法?第一次和第二次声明有什么区别?两者似乎都在做同样的事情?
谁能照亮这个区域。
【问题讨论】: