我有以下代码
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
..
那么递归类型绑定的含义是什么? 提前谢谢。
答案 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);