Scala视图边界,我的例子有什么问题

时间:2016-09-16 13:37:18

标签: scala

我使用下面的示例来加强对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))
}

但编译时抛出的错误:

Failure

我无法找出原因,感谢有人提供任何帮助。

1 个答案:

答案 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))
  }
}