【发布时间】:2019-02-07 14:45:10
【问题描述】:
Joshua Bloch 提出了 PECS,其中规定了何时使用 ? extends T 和 ? super T。如果您从 Collections 框架的角度来考虑 PECS,那么它非常简单。如果向数据结构添加值,请使用? super T。如果从数据结构中读取,请使用? extends T。
例如:
public class Collections {
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
for (int i = 0; i < src.size(); i++)
dest.set(i, src.get(i));
}
}
如果我检查签名
public static <T> void sort(List<T> list, Comparator<? super T> c)
我看到 Comparator 使用? super,所以它应该是一个消费者。看代码,比较器c只用于产生东西,因为它被问到比较的逻辑。
一方面,我理解为什么它是超类,因为作为开发人员,我想使用T 类的比较器以及T 超类的比较器,因为T 的对象也是超类的类型T。但是当我尝试从 PECS 的角度思考时,我无法理解。
PECS 是否仅适用于 Collections 框架?如果没有,有人可以向我解释一下比较器在Collections.sort 中消耗了什么吗?
【问题讨论】:
标签: java generics collections bounded-wildcard