更好的方法是遵循标准库中的Ordered
和Ordering
特征。前者类似于您上面的示例。但事实证明,后者使用“类型类”更容易、更灵活。
首先,定义一个类型类和一个 mixin 特征:
class Ord[T](val lessThan: (T, T) => Boolean)
trait CompareOps[T] { this: T =>
def < (that: T)(implicit ord: Ord[T]) = ord.lessThan(this, that)
def > (that: T)(implicit ord: Ord[T]) = ord.lessThan(that, this)
}
现在,对于您的示例,您所要做的就是将类型类的实例放入隐式范围:
case class Example(x: Int) extends CompareOps[Example]
implicit val exampleOrd = new Ord[Example](_.x < _.x)
scala> Example(3) > Example(4)
res0: Boolean = false
scala> Example(3) < Example(4)
res1: Boolean = true
通常,当您编写一个类时,您会放入Ord[Example]
intoExample
的伴随对象。Example
然后,当实例需要它时,它将自动处于隐式范围内。
CompareOps
另外:如果你定义为一个类并使用隐式转换,你实际上不必扩展CompareOps
,但这有点超出了这个答案的范围,所以我在 这里写了。