可比较和比较
在实现依赖于 double
的 compareTo(..)
方法时,请不要执行以下操作:
public int comareTo(MyClass other) {
return (int)(doubleField - other.doubleField); //THIS IS BAD
}
由 (int)
强制转换引起的截断将导致该方法有时错误地返回 0
而不是正数或负数,因此可能导致比较和排序错误。
相反,最简单的正确实现是使用 Double.compare ,如下:
public int comareTo(MyClass other) {
return Double.compare(doubleField,other.doubleField); //THIS IS GOOD
}
自 Java 1.2 以来 ,Comparable<T>
的非通用版本,简称 Comparable
。除了与遗留代码接口之外,实现通用版本 Comparable<T>
总是更好,因为它不需要在比较时进行转换。
一个类与其自身相当是非常标准的,如:
public class A implements Comparable<A>
虽然有可能打破这种范式,但在这样做时要谨慎。
如果该类实现了 Comparable<T>
,那么仍然可以在类的实例上使用 Comparator<T>
。在这种情况下,将使用 Comparator
的逻辑; Comparable
实现指定的自然顺序将被忽略。