该错误与覆盖中的不兼容类型有关,而不是与隐式有关。
您应该删除上限type T <: Ordered[T]
。
Int
不扩展Ordered
。
尝试类型参数而不是类型成员
sealed abstract class Value[T] extends /*Expression with*/ Ordered[Value[T]] {
def value: T
override def compare(that: Value[T]): Int
}
case class IntValue(value: Int) extends Value[Int] {
override def compare(that: Value[Int]): Int = value.compare(that.value)
}
与类型成员类似的代码
sealed abstract class Value extends /*Expression with*/ Ordered[Value {type T = self.T}] { self =>
type T
def value: T
override def compare(that: Value {type T = self.T}): Int
}
case class IntValue(value: Int) extends Value {
type T = Int
override def compare(that: Value {type T = Int}): Int = value.compare(that.value)
}
是不可能的,因为Error: illegal cyclic reference
。
Scala:抽象类型与泛型
https://typelevel.org/blog/2015/07/13/type-members-parameters.html
https://www.youtube.com/watch?v=R8GksuRw3VI
https://tpolecat.github.io/2015/04/29/f-bounds.html
如果你想委托,那么你应该使用type class Ordering
而不是 OOP trait Ordered
。Int
没有扩展Ordered
,但有一个Ordering
for的实例Int
sealed abstract class Value[T] {
def value: T
}
case class IntValue(value: Int) extends Value[Int]
implicit def valueOrdering[T, A](implicit
ev: A <:< Value[T],
ordering: Ordering[T]
): Ordering[A] = ordering.on(_.value)
import Ordering.Implicits._
IntValue(1) < IntValue(2) // -1
或者
import Ordered._
IntValue(1) < IntValue(2) // true
IntValue(1).compare(IntValue(2)) // -1
类型类的方法可用于类型成员
sealed abstract class Value {
type T
def value: T
}
case class IntValue(value: Int) extends Value {
override type T = Int
}
implicit def valueOrdering[A <: Value](implicit
ordering: Ordering[A#T]
): Ordering[A] = ordering.on(_.value)
// implicit def valueOrdering[_T, A](implicit
// ev: A <:< Value { type T = _T },
// ordering: Ordering[_T]
// ): Ordering[A] = ordering.on(_.value)