public abstract class Fruit implements Comparable<Fruit> {
protected String name;
protected int size;
protected Fruit(String name, int size){
this.name = name;
this.size = size;
}
public int compareTo(Fruit that){
return this.size < that.size ? - 1:
this.size == that.size ? 0 : 1;
}
}
class Apple extends Fruit {
public Apple(int size){ super("Apple",size);
}
public class Test {
public static void main(String[] args) {
Apple a1 = new Apple(1); Apple a2 = new Apple(2);
List<Apple> apples = Arrays.asList(a1,a2);
assert Collections.max(apples).equals(a2);
}
}
此程序中equals()和compareTo()方法之间的关系是什么?
我知道当类实现接口Comparable时,它必须包含compareTo方法的主体定义,但我不明白这个方法对调用Collections.max(apples).equals(a2)
有什么影响。
并且compareTo从哪里获取“that.size”的值?
答案 0 :(得分:1)
compareTo
方法会根据Fruit
对size
进行比较。这是一个自定义实现。 Collections.max
将多次调用与您的集合大小相关的compareTo
,以推断集合中的max
项,从而调用compareTo
。 Object#equals
时将调用equals
,因为它未在Fruit
中重写。 Apple
,即在此情况下,大小为Apple
的同一2
之间。它应该返回true
。答案 1 :(得分:0)
equals
和compareTo
不会在此代码中相互影响。 compareTo
方法确定将哪个元素作为max
返回,然后代码检查该元素是否等于a2
。
换句话说,它会检查a2
是否是最大的苹果,因为compareTo
进行的比较只会检查尺寸。
从compareTo取值&#34; that.size&#34;?
size
是Fruit
类中的字段。在compareTo
中,this
和that
都是Fruit
的实例,因此,它们都有size
字段。