为什么超级,不延伸到这里?来自 java 教程:ray gallardo 等人的基础知识短期课程

问题描述 投票:0回答:1

我的问题是在下面的代码中,为什么 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 等人的基础知识短期课程

java generics wildcard
1个回答
1
投票

你当然可以把方法签名写成

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
),但它确实not
extend Comparable<Bb>
.

我们所需要的只是我们可以比较该类型的两个实例,通过检查其父类之一是否实现

Comparable
.

使用

T extends Comparable<?>
不起作用,因为当我们调用
compareTo
时,我们所知道的是
T
可以与某个未知类进行比较,我们不知道它可以与
T
进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.