我正在尝试将丰富我的库模式与具有隐式排序的 scala 集合方法结合使用。
给出这个定义:
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)
}
给我这个编译错误?
error: No implicit Ordering defined for AnyVal{def getClass(): java.lang.Class[_ >: Int with Double <: AnyVal]}. val mx = List(1, 2, 7, 1, 4, 8, 2, 5, 47, 2, 7).myMinBy(_.toDouble)
最佳答案
myMinBy
中的 B >: A
没有任何理由。这就是 AnyVal
的来源,即 Int
和 Double
的最小上限。您的代码适用于 myMinBy[B](...)
关于scala - 如何向 scala 集合对象添加采用隐式排序的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240815/