inheritance - 扩展扩展有序的Scala类

标签 inheritance scala covariance

我在扩展扩展 Ordered[Base] 的基类时遇到问题。我的派生类不能扩展 Ordered[Derived] 因此不能用作 TreeMap 中的键。如果我创建一个 TreeMap[Base] 然后只是覆盖 Derived 中的比较,但它不是我想要的。我希望能够将派生类作为键。有没有解决的办法?

case class A(x: Int) extends Ordered[A] {
  def compare(that: A) = x.compare(that.x)
}

// Won't compile
//  case class B(val y : Int) extends A(1) with Ordered[B] {
//    def compare(that: B) = x.compare(that.x) match {
//      case 0 => y.compare(that.y)
//      case res => res
//    }
//  }

// Compiles but can't be used to define a TreeMap key
case class B(y: Int) extends A(1) {
  override def compare(that: A) = that match {
    case b: B => x.compare(b.x) match {
      case 0 => y.compare(b.y)
      case res => res
    }
    case _: A => super.compare(that)
  }
}

def main(args: Array[String]) {
  TreeMap[B, Int]() // Won't compile
}

编辑

This discussion在 scala 邮件列表上似乎非常相关,但它让我有点失望。

最佳答案

您可以使用从 B 到 Ordered[B] 的类型转换:

class OrderedB(me : B) extends Ordered[B]{
    def compare(that: B) = me compare that
}
collection.immutable.TreeMap.empty[B, Int](new OrderedB(_))

我认为 B 始终是 A 的子类型,这意味着 Order[A] 类型 A 是不变的。它不能定义第二个比较方法来实现与 Ordered[A] 中的比较方法具有相同类型错误的 Order[B]。

或者,您可以定义从 B 到 Ordered[B] 的隐式类型版本:
implicit def orderedA2orderedB[B <: A with Ordered[A]](b : B) : Ordered[B] = b.asInstanceOf[Ordered[B]]
collection.immutable.TreeMap[B, Int]()

这应该是有效的。我不知道在没有强制转换的类型系统中表达这一点的方法。

关于inheritance - 扩展扩展有序的Scala类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1818777/

相关文章:

C#继承帮助

java - 编译派生类时出现错误消息

Scala 使用模式匹配获取列表的第一个和最后一个元素

scala - Scala带尾空格

javascript - jQuery:拒绝应用内联样式,因为它违反了以下内容安全策略指令

r - 在 Lavaan 中将协方差设置为零

generics - Monodroid 泛型不是协变的?

c# - 在不知道类型的情况下返回泛​​型

java - 类型 安全警告

java - 使用继承时存储 'employee code' 的公共(public)值