我的问题是在下面的代码中,为什么 Comparable 而不是 Comparable 或者 Comparable ?
comparable 可以比较 T 的祖先,但在列表中我们只有 T 的子类型?
还有,为什么T extends Object,不是默认的吗?
编写一个通用方法来查找列表范围 [begin, end) 中的最大元素。
回答: 导入 java.util.*;
public final class Algorithm {
public static <T extends Object & Comparable<? super T>>
T max(List<? extends T> list, int begin, int end) {
T maxElem = list.get(begin);
for (++begin; begin < end; ++begin)
if (maxElem.compareTo(list.get(begin)) < 0)
maxElem = list.get(begin);
return maxElem;
}
}
这是来自 java 教程的第六版:ray gallardo 等人的基础知识短期课程
你当然可以把方法签名写成
public static <T extends Comparable<T>> T max(List<? extends T> list, int begin, int end)
这适用于大多数类型。
但它比我们需要的更严格。
考虑:
class Aa implements Comparable<Aa> {
@Override
public int compareTo(Aa o) {
return 0;
}
}
class Bb extends Aa {}
Bb
的每个实例都知道如何将自己与另一个Bb
的实例进行比较(因为Bb
IS-A Aa
),但它确实notextend Comparable<Bb>
.
我们所需要的只是我们可以比较该类型的两个实例,通过检查其父类之一是否实现
Comparable
.
使用
T extends Comparable<?>
不起作用,因为当我们调用 compareTo
时,我们所知道的是 T
可以与某个未知类进行比较,我们不知道它可以与 T
进行比较。