我在阅读泛型时遇到了PECS(制片extends人和消费者的super简称).
能否给我一个人解释如何使用佩奇之间解决困惑extends和super?
刚刚完成了Java 7的java.util.Collections类的实现,看到了一些我不理解的东西.在max函数签名中,为什么T受限于Object?
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (next.compareTo(candidate) > 0)
candidate = next;
}
return candidate;
}
Run Code Online (Sandbox Code Playgroud)
max 如果省略Object绑定似乎工作正常.
public static <T extends Comparable<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) …Run Code Online (Sandbox Code Playgroud) 我读过Joshua Bloch的精彩"有效Java".但书中的一个例子对我来说还不清楚.它来自关于泛型的章节,具体项目是"第28项:使用有界通配符来增加API灵活性".
在这个项目中,它展示了如何使用有界类型参数和有界通配符类型编写从集合中选择最大元素的算法的最通用和防弹(在类型系统的角度)版本.
编写的静态方法的最终签名如下所示:
public static <T extends Comparable<? super T>> T max(List<? extends T> list)
Run Code Online (Sandbox Code Playgroud)
它Collections#max与标准库中的函数大致相同.
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
Run Code Online (Sandbox Code Playgroud)
我理解为什么我们需要在T extends Comparable<? super T>类型约束中使用有界通配符,但它在参数的类型中是否真的有必要?在我看来,这将是相同的,如果我们只留下List<T>或者Collection<T>,是不是?我的意思是这样的:
public static <T extends Comparable<? super T>> T wrongMin(Collection<T> xs)
Run Code Online (Sandbox Code Playgroud)
我写了以下使用两个签名的愚蠢示例,并没有看到任何不同之处:
public class Algorithms {
public static class ColoredPoint extends Point {
public final Color color;
public ColoredPoint(int x, int y, Color color) { …Run Code Online (Sandbox Code Playgroud)