我不明白此错误要我做什么:

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)
}
BaseElemT的简单容器。 OrderedElemOrderedT <: 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
    }
    

    09-05 19:40