为什么我会得到;找不到参数ord的隐式值:scala.math.Ordering[T]“0”;
我有一个简单的示例trait,它有一个从Ordered派生的泛型类型的值。我找不到任何实际使用该值的方法,尽管我得到“找不到参数order:scala.math.Ordering[t]的隐式值”。代码如下:为什么我会得到;找不到参数ord的隐式值:scala.math.Ordering[T]“0”;,scala,Scala,我有一个简单的示例trait,它有一个从Ordered派生的泛型类型的值。我找不到任何实际使用该值的方法,尽管我得到“找不到参数order:scala.math.Ordering[t]的隐式值”。代码如下: trait Example[T <: Ordered[_]] { val key: T def before(that: Example[T]): Boolean = (key < that.key) } trait-Example[T在我看来应该是这样的 t
trait Example[T <: Ordered[_]] {
val key: T
def before(that: Example[T]): Boolean = (key < that.key)
}
trait-Example[T在我看来应该是这样的
trait Example[T <: Ordered[T]] {
trait-Example[T我相信,我没有编译,因为你说T
应该在任何类型上排序。我们可以这样编写一个等价的trait(如果我错了,请纠正我,我不确定它是否可以被视为等价的,但至少你会从编译器那里收到相同的错误):
当我们考虑这个定义时-如果key
是Ordered[A]
而不是,那么.key
应该是A
类型(根据
trait Example1[A, T <: Ordered[A]] {
val key: T
def before(that: Example1[A, T]): Boolean = (key < that.key)
}
trait Ordered[A] extends java.lang.Comparable[A] {
...
def < (that: A): Boolean = (this compare that) < 0
...
}
object Ordered {
/** Lens from Ordering[T] to Ordered[T] */
implicit def orderingToOrdered[T](x: T)(implicit ord: Ordering[T]): Ordered[T] =
new Ordered[T] { def compare(that: T): Int = ord.compare(x, that) }
}
abstract class Example[T: Ordering] {
val key: T
val ord = implicitly[Ordering[T]]
import Ordered._
def before(that: Example[T]): Boolean = key < that.key
}
var one = new Example[Int] {val key = 1}
var two = new Example[Int] {val key = 2}
println(one.before(two)) // prints: true
println(two.before(one)) // prints: false