类型不匹配,预期:T,实际:T

时间:2014-05-23 19:58:20

标签: scala inheritance compare type-parameter

我不明白这个错误要我做什么:

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的简单容器。 OrderedElemOrdered的{​​{1}}容器。所以我希望将T <: Ordered之间的比较作为各自元素的比较。

错误位于OrderedElem的覆盖范围内,错误突出显示的代码为compare

  1. 这个错误说什么,如何解决?

  2. 附带问题,是否可以简化that.e的声明并保留所需的语义?

1 个答案:

答案 0 :(得分:1)

问题在于OrderedElem[T <: Ordered]部分。在遵循om-nom-nom的气味清理并修复他注意到的错误之后,我发现像Int(带有原始表示)的类型在Scala中没有Ordered范围(参见this question),所以必须使用&#34;视图绑定&#34; <%告诉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
}