我不明白这个错误要我做什么:
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
的{{1}}容器。所以我希望将T <: Ordered
之间的比较作为各自元素的比较。
错误位于OrderedElem
的覆盖范围内,错误突出显示的代码为compare
。
这个错误说什么,如何解决?
附带问题,是否可以简化that.e
的声明并保留所需的语义?
答案 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
}