我有一个三类:1.class 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;
}
}
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;
}
}
3.class Apple
扩展Fruit
:
public class Apple extends Fruit {
public Apple(int size) {
super("Apple", size);
}
}
现在的问题是这样的:
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);
}
}
根据这篇文章Java语法问题:我应该用这种方式写它:public static <T extends Comparable<? super T>> T max(Collection<? extends T> coll)
。但这现在工作正常,为什么呢?类Apple
没有实现Comparable<Apple>
,也没有实现super
。
[更新]
Java泛型和收藏集说:
如果没有
super
通配符,则List<Apple>
即使List<Fruit>
允许查找a的最大值,查找a的最大值也是非法的。
假设我们将max
方法更改为:
<T extends Comparable<T>> T max(Collection<? extends T> coll)
您将无法获取max
a的,List<Apple>
因为Apple
它没有实现Comparable<Apple>
,而是实现了Comparable<Fruit>
。但是您和我都非常清楚,一个人Apple
知道如何将自己与另一个人进行比较,Fruit
因为它继承了该功能。
我们通过更改max
对此的声明来解决此问题:
<T extends Comparable<? super T>> T max(Collection<? extends T> coll)
这意味着我们接受以下任何类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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句