无论是Javadoc还是代码本身,Comparator接口都定义了:
int compare(T o1, T o2); boolean equals(Object obj);
但这没有编译任何概率:
Comparator a = new Comparator() { @Override public int compare(Object o1, Object o2) { //.. } };
但这确实是:
Comparator a = new Comparator() { @Override public boolean equals(Object comparator) { //.. } };
接口不允许用户重写方法的方法是什么?
首先,JavaDocs清楚地解释了您应该实现此方法:
此外,仅当指定对象也是一个比较器并且施加与该比较器相同的顺序时,此方法才能返回true。因此,comp1.equals(comp2)意味着sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))对于每个对象引用o1和o2。
comp1.equals(comp2)
sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))
o1
o2
但后来:
请注意,始终不要覆盖即可Object.equals(Object)。
Object.equals(Object)
equals()即使它是接口的一部分,如何也不可以覆盖它?因为已经为Java 中的Object每个对象(在类中)实现了此方法。
equals()
Object
在接口的声明仅在那里强调的重要性,equals()至于Comparator通过增加额外的Javadoc解释。
Comparator
顺便说一句,如果您的比较器是无状态的,则应该只有一个实例-在这种情况下,默认equal()实现就可以了。
equal()