2

我有以下一段代码

public static <T extends Comparable<T>> T max(List<T> list){
    Iterator<T> iter = list.iterator();
    ...
    // code for finding the max element in the list
    ...
 }

我的问题是,在这种情况下,需要绑定递归类型吗?据我的理解,T extends Comparable < T >意思是说,T只能跟T自己比较。这是因为,Class 'T' implements Comparable<T>所以,

class MyClass implements Comparable<MyClass>{
}

如果我在这里错了,请随时纠正我。

所以现在来到实际的疑问,为什么我们需要指定< T extends Comparable < T > >?参数List<T>列表将包含相同类型元素的任何方式。即,假设我传递了一个 type 的参数List < MyClass2 >,那么所有元素都将属于同一类型,即MyClass2..

那么递归类型绑定的含义是什么?提前致谢。

4

2 回答 2

4

为什么需要指定<T extends Comparable<T>>?因为 Comparable 不要求实现类与自身具有可比性。理论上你可以写类似的东西

class Circle extends Shape implements Comparable<Integer> {
    ...
}

由于 Comparable 本身并没有这种限制,因此您在编写函数时必须这样做。但是,给定的界限比您需要的更严格。你可以打电话

public static <T extends Comparable<? super T>> T max(List<T> list) {
    ...
}

这意味着T它可以与自身的某个超类相媲美。您想要这样做的原因在 rgettman 的 Fruit 示例中给出。T仍然总是与自身可比,但可比不必相对于T自身来定义。

于 2013-05-14T17:38:32.830 回答
3

您可能有一个类层次结构,它强制子类成为Comparable超类型。例如,您可能有

class Fruit extends Comparable<Fruit>

所以每一块Fruit都可以与另一块相媲美Fruit。然后你有

class Apple extends Fruit ...
class Banana extends Fruit ...

每个子类都是一个Fruit,所以它们都是Comparable<Fruit>,不是Comparable<Apple>和不是Comparable<Banana>

这使您可以在 a 中找到最大值Fruit(可能是一个不好的例子,最大的水果是多少?)List<Apple>

List<Apple> apples = getApples();
Fruit maximum = max(apples);

不必是List<Fruit>.

正如评论中指出的那样,该max方法最好是:

public static <T extends Comparable<? super T>> T max(List<T> list){

以便以下每个工作:

List<Apple> apples = getApples();
Apple maxAppleOfApples = max(apples);
Fruit maxFruitOfApples = max(apples);

List<Banana> bananas = getBananas();
Banana maxBananaOfBananas = max(bananas);
Fruit maxFruitOfBananas = max(bananas);

List<Fruit> fruits = getFruit();
Fruit maxFruitOfFruit = max(fruits);
于 2013-05-14T17:03:48.887 回答