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

Java 在这种情况下,递归类型绑定有什么用途,java,generics,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 ... } 如果我错了,请随时纠正我 现在我们来讨论一下实际的疑问,为什么我们需要指定?参数ListL

我有下面的代码

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
    ...
 }
如果我错了,请随时纠正我

现在我们来讨论一下实际的疑问,为什么我们需要指定
?参数
List
List将包含相同类型的元素的任何方式。i、 例如,假设我传递了一个类型为
List
的参数,那么所有元素都将是相同的类型,即
MyClass2

那么递归类型界限的含义是什么呢?
提前感谢。

您可能有一个类层次结构,它强制子类与超类型具有可比性。例如,您可能有

class Fruit extends Comparable<Fruit>
每个子类都是
的果实
,因此它们都是
可比的
,而不是
可比的
和不
可比的

这允许您在
列表中找到最大
水果(可能是个坏例子,最大水果是什么?)

使以下各项工作:

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);
List apples=getApples();
苹果maxAppleOfApples=最大(苹果);
水果最大果数苹果=最大果数(苹果);
列出香蕉=获取香蕉();
香蕉最大值=最大值(香蕉);
水果最大香蕉果=最大(香蕉);
List fruits=getFruit();
水果maxFruitOfFruit=最大(水果);

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

class Circle extends Shape implements Comparable<Integer> {
    ...
}
类圆扩展形状{
...
}
由于Comparable本身不作此限制,因此在编写函数时必须始终保持一致。但是,给定的边界比您需要的限制更严格。你可以打电话

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

public static您可以创建一个与其他类类似的类。为了获得最大的灵活性,您可能实际上需要Joshua Bloch给出的
最佳描述。查看此视频以获得最佳澄清。主题在22:00开始好吧我明白了90%。再澄清一下。type参数如下所示。。所以在这种情况下,T在两个位置上必须相同,即第一个T和第二个T。但这在你给出的例子中并不成立。例如,第一个T包含苹果/香蕉,第二个T包含水果。。同一类型参数T怎么可能包含两个不同的值?@rgetman这是行不通的。如果
T
是水果,则不能传入
列表
,只能传入
列表
。你要么把它做成
@ILMTitan是的,我在发布后也看到了。请看我的更新。你是对的<代码>“因为Comparable不要求实现类与自身具有可比性。”事实上,不能。这在泛型中是不可能表达的,而且也永远不需要。
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);
class Circle extends Shape implements Comparable<Integer> {
    ...
}
public static <T extends Comparable<? super T>> T max(List<T> list) {
    ...
}