查看抽象参数的界限:有关排序的用例

时间:2012-07-09 17:51:27

标签: scala

我有一系列容器,形式为

trait Value {
  type Internal
  implicit def order:Internal => Ordering[Internal]
  def value:Internal
}

我希望能够使用Internal类型的顺序定义Value的特定子类型的排序,例如:

object Value {

  implicit def order[V <: Value]:Ordering[V] = Ordering((_:V).value)

}

但是,编译器说V#Internal没有隐式排序,即使在特征中指定了这样的排序。

有没有办法实现我想要做的事情?

1 个答案:

答案 0 :(得分:2)

您需要Internal上的类型约束,以确保它具有Ordering。如果您将Value定义为class

,这很容易
abstract class Value[Internal: Ordering] {
  def value: Internal
}

作为一种特质,我认为不可能直接应用这样的约束,但您可以要求提供合适的Ordering

trait Value {
  type Internal
  def value: Internal
  implicit val ord: Ordering[Internal]
}

并用作

class Foo extends Value {
  type Internal = Int
  def value = 42
  implicit val ord = Ordering[Internal]  // Ordering's apply method
}