如何添加对scala集合对象进行隐式排序的方法

时间:2011-11-23 10:45:32

标签: scala implicit-conversion implicit enrich-my-library

我尝试使用带有隐式排序的scala集合方法来使用enrich-my-library模式。

鉴于此定义:

object ImplicitTest {
  implicit def RichTraversableOnce[A](t: TraversableOnce[A]): RichTraversableOnce[A] =
    new RichTraversableOnce[A](t)

  class RichTraversableOnce[A](val t: TraversableOnce[A]) {
    def myMinBy[B >: A](f: A => B)(implicit cmp: Ordering[B]): A = {
      if (t.isEmpty)
        throw new UnsupportedOperationException("empty.myMinBy")

      t.reduceLeft((x, y) => if (cmp.lteq(f(x), f(y))) x else y)
    }
  }
}

为什么这个测试:

 @Test
  def testOrdering {
    import ImplicitTest._
    val mx = List(1, 2, 7, 1, 4, 8, 2, 5, 47, 2, 7).myMinBy(_.toDouble)

    // ...but this works:
    // val mx = List(1, 2, 7, 1, 4, 8, 2, 5, 47, 2, 7).minBy(_.toDouble)

    println(mx)
  }

给我这个编译错误?

  

错误:没有为AnyVal定义隐式排序{def getClass():java.lang.Class [_>:Int with Double&lt ;: AnyVal]}。   val mx = List(1,2,7,1,4,8,2,5,47,2,7).myMinBy(_。toDouble)

1 个答案:

答案 0 :(得分:4)

B >: AmyMinBy没有理由。这是AnyVal来自IntDouble的最小上限。您的代码适用于myMinBy[B](...)