Maj*_*imi 4 java generics collections
我有一个三类:1.class 在a Algorithm中max()找到最大值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>.
假设我们将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,以便:
T implements Comparable<T>,或...T implements Comparable<X>对于一些X这样X的超级类T为了找到它max,我们必须确保任何实例都T可以安全地接受另一个实例T作为其compare方法的参数.
在第一个场景中,很明显任何实例都T可以安全地接受另一个实例T作为其compare(T)方法的参数.
在第二个场景中,任何实例都T可以安全地接受另一个实例T作为其compare(X)方法的参数,因为所有实例T都是其实例X.
您的示例说明了第二种情况,其中T对应于Apple并X对应于Fruit.