我正在阅读关于 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) { ... }
该文件不鼓励使用第二种声明,并提倡使用第一种语法?第一个声明和第二个声明有什么区别?两者似乎都在做同样的事情?
有人能照亮这个区域吗。