类型使用的接口都有一个固有的顺序。

compareTo操作定义了对象的全序关系,可用来排序和分类。

Comparable应该使用类型的自然顺序。 如果一个类型有不止一种方式可以被排序,并且它们没有明显的自然顺序, 那么它可能最好不要使用Comparable接口, 然后使用单独的Comparator代替。

建议Comparable的顺序与==操作符保持一致(a.compareTo(b) == 0,当且仅当a == b时), 但这并不是绝对的。 例如,doubleDateTime都有compareTo方法,但与==操作符的结果并不一样。 对于double,compareTo比相等更加的精准;而DateTime并不准确。

例子:

 (0.0).compareTo(-0.0);  // => 1
 0.0 == -0.0;            // => true
 var dt = new DateTime.now();
 var dt2 = dt.toUtc();
 dt == dt2;              // => false
 dt.compareTo(dt2);      // => 0

Comparable接口并不意味着存在比较操作符<<=>>=。 那些只应该被在顺序只是小于/大于时被定义。 也就是说,对于一个排序的两个元素,你会很自然的使用"小于"这样的话。

如果==操作符和compareTo结果不一致,那么比较操作符应该对照==操作符, 然后可能和compareTo结果也不一样。 否则,应该匹配compareTo方法, 以便当且仅当a.compareTo(b) < 0时,a < b

double类定义了比较操作,并且相互保持了一致。 操作符与double.compareTo的不同点在于,比较-0.0和NAN(0.0)的时候。

DateTime类并没有比较操作符,取而代之, 它有命名更明确的方法DateTime.isBeforeDateTime.isAfter

Implemented by

Static Methods

compare(Comparable a, Comparable b) int

比较一个可比较的值与另一个值的Comparator

Constructors

Comparable()

Properties

hashCode int

获取对象的哈希值。

read-only, inherited
runtimeType Type

表示对象的运行时类型。

read-only, inherited

Operators

operator ==(other) bool

相等操作符。

inherited

Methods

compareTo(T other) int

将此对象与另一个Comparable进行比较。

noSuchMethod(Invocation invocation) → dynamic

当一个不存在的函数或成员变量被访问时,该函数被调用。

inherited
toString() String

返回一个用来表示对象的字符串。

inherited