问题<T延伸可比较<?超级T >>

Maj*_*imi 4 java generics collections

我有一个三类:1.class 在a Algorithmmax()找到最大值Collection:

public class Algorithm {

    public static <T extends Comparable<T>> T max(Collection<? extends T> coll) {
        T max = coll.iterator().next();

        for (T elm : coll) {
            if (max.compareTo(elm) < 0)
                max = elm;
        }

        return max;
    }
}
Run Code Online (Sandbox Code Playgroud)

2.Class Fruit:

public class Fruit implements Comparable<Fruit> {
    private String name;
    private int size;

    public Fruit(String name, int size) {
        this.name = name;
        this.size = size;
    }

    public int compareTo(Fruit that) {
        if (size < that.size)
            return -1;
        else if (size == that.size)
            return 0;
        else
            return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

3.class Apple扩展Fruit:

public class Apple extends Fruit {
    public Apple(int size) {
        super("Apple", size);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是:

public class Main
{
    public static void main(String[] args) {        
        Apple a1 = new Apple(10);
        Apple a2 = new Apple(34);

        List<Apple> apples = Arrays.<Apple>asList(a1, a2);

        System.out.println(Collections.max(apples).size);
    }
}
Run Code Online (Sandbox Code Playgroud)

根据这篇文章Java - 语法问题:我应该用这样写的:public static <T extends Comparable<? super T>> T max(Collection<? extends T> coll).但它现在工作正常.为什么?类Apple没有实现Comparable<Apple>,没有super.

[更新]
Java Generics and Collections Book说:

如果没有super通配符,List<Apple> 即使找到最大值为a ,找到a的最大值也是非法的List<Fruit>.

Ada*_*ter 5

假设我们将max方法更改为:

<T extends Comparable<T>> T max(Collection<? extends T> coll)
Run Code Online (Sandbox Code Playgroud)

你无法获得maxa,List<Apple>因为Apple它没有实现Comparable<Apple>,它实现了Comparable<Fruit>.但是你和我完全清楚Apple知道如何将自己与另一个进行比较,Fruit因为它继承了这个功能.

我们通过更改声明max来解决此问题:

<T extends Comparable<? super T>> T max(Collection<? extends T> coll)
Run Code Online (Sandbox Code Playgroud)

这意味着我们接受任何类T,以便:

  1. T implements Comparable<T>,或...
  2. T implements Comparable<X>对于一些X这样X的超级类T

为了找到它max,我们必须确保任何实例都T可以安全地接受另一个实例T作为其compare方法的参数.

在第一个场景中,很明显任何实例都T可以安全地接受另一个实例T作为其compare(T)方法的参数.

在第二个场景中,任何实例都T可以安全地接受另一个实例T作为其compare(X)方法的参数,因为所有实例T都是其实例X.

您的示例说明了第二种情况,其中T对应于AppleX对应于Fruit.