在这种情况下,递归类型绑定的用途是什么

时间:2013-05-14 16:58:47

标签: java generics

我有以下代码

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>列表将以任何方式包含相同类型的元素。即,假设我传递了List < MyClass2 >类型的参数,那么所有元素都将是相同的类型,即MyClass2 ..

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

2 个答案:

答案 0 :(得分: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本身进行比较。

答案 1 :(得分:3)

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

class Fruit extends Comparable<Fruit>

所以Fruit的每一部分都与Fruit的另一部分相当。那你有

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

每个子类都是Fruit,因此它们都是Comparable<Fruit>,而不是Comparable<Apple>而不是Comparable<Banana>

这允许您在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);