我不明白此错误要我做什么:
Type mismatch, expected: T, actual: T
我只有3行代码:
case class BaseElem[T](e: T)
case class OrderedElem[T <: Ordered](override val e: T) extends BaseElem[T](e) with Ordered[OrderedElem[T]] {
override def compare(that: OrderedElem[T]): Int = this.e.compare(that.e)
}
BaseElem
是T
的简单容器。 OrderedElem
是Ordered
的T <: Ordered
容器。因此,我希望OrderedElem
之间的比较是它们各自元素的比较。错误在于
compare
的覆盖中,错误突出显示的代码是that.e
。OrderedElem
的声明并保留所需的语义吗? 最佳答案
问题出在OrderedElem[T <: Ordered]
部分。遵循om-nom-nom的气味清除并修复了他指出的错误之后,我发现Int
(具有原始表示形式)之类的类型不会在Scala中扩展Ordered
(请参见this question),因此必须使用“ View 绑定(bind)” <%
来告诉Scala还寻找可用的隐式转换。
我现在有:
class BaseElem[T](val e: T)
class OrderedElem[U <% Ordered[U]](override val e: U) extends BaseElem(e) with Ordered[OrderedElem[U]] {
override def compare(that: OrderedElem[U]): Int = this.e.compare(that.e)
}
object Run extends App {
val a = new OrderedElem(0)
val b = new OrderedElem(1)
println(a < b) // => true
}