0

我有一个容器系列,形式为

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 没有可用的隐式排序,即使在 trait 中指定了这样的排序。

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

4

1 回答 1

2

你需要一个类型约束Internal来确保它有一个Ordering. 如果您定义Value为 a ,这很容易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
}
于 2012-07-09T19:38:46.690 回答