如何为隐式转换提供附加参数

时间:2014-08-08 20:00:08

标签: java scala

我正在进行这项练习来自" Scala因为不耐烦而且#34;本书,来自章节" Implicits":

  

根据它们与原点的距离比较类java.awt.Point的对象。

我还没有想出更好的东西:

class PointDistOrdered( origin: Point, p1: Point) extends Ordered[Point] {
  private def compareDoubles(d1: Double, d2: Double) = 
    if (d1 < d2) -1 
    else 
      if (d1 == d2) 0 
      else 1
  def compare(p2: Point) = compareDoubles(p1.distance(origin), p2.distance(origin))
}
object PointConversions {
  def getDistOrder(origin: Point) = (p: Point) => new PointDistOrdered(origin, p)
}

这就是我使用它的方式,这看起来很丑陋:

import PointOrders.getDistOrder
implicit def order = getDistOrder(new Point(0, 0))

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

您不需要创建一个由Point组成的单独的类,只是为了提供Ordering隐式(类型类)。

implicit val PointOrdering: Ordering[Point] = new Ordering[Point] {
  def compare(a: Point, b: Point): Int = ??? // your impl
}

然后可以使用此比较/排序点,例如使用Sorting伴随对象。