我使用下面的示例来加强对Scala视图边界的理解:
case class Person(age: Int)
object P003 {
implicit def m(p: Person) = new Ordering[Person] {
override def compare(x: Person, y: Person): Int = {
x.age - y.age
}
}
def sort[T <% Ordering[T]](list: List[T]) = list.sorted
def main(args: Array[String]): Unit = {
val list = List(Person(10), Person(2), Person(8))
println(sort(list))
}
但编译时抛出的错误:
我无法找出原因,感谢有人提供任何帮助。
答案 0 :(得分:2)
Scala查看边界是一种机制,允许您将类型A
视为类型B
。在您的示例中,您看起来已将Ordering[T]
与Ordered[T]
混合在一起。当一个类通过添加视图边界来实现Ordered[T]
时,它允许您将T
视为Ordered[T]
。通过您的示例,您可以将Person
视为Ordered[Person]
,并将其作为list.sort
的隐式订单提供。
这是你的班级实际应该是这样的:
case class Person(age: Int) extends Ordered[Person] {
override def compare(that: Person): Int = this.age - that.age
}
然后:
object P003 {
def sort[T <% Ordered[T]](list: List[T]) = list.sorted
def main(args: Array[String]): Unit = {
val list = List(Person(10), Person(2), Person(8))
println(sort(list))
}
}
收率:
List(Person(2), Person(8), Person(10))
但是,View Bounds已被弃用(关于此问题,有一段相当长的讨论here)。您可以使用Context Bound和Ordering.by
:
case class Person(age: Int)
object P003 {
implicit def personOrdering: Ordering[Person] = Ordering.by(p => p.age)
def sort[T: Ordering](list: List[T]) = list.sorted
def main(args: Array[String]): Unit = {
val list = List(Person(10), Person(2), Person(8))
println(sort(list))
}
}