在Scala中引用特征中的子类型

时间:2013-06-13 09:26:17

标签: scala generics covariance scala-2.10 contravariance

由于Scala中对泛型的广泛支持,实现以下循环参数边界的最佳方法是什么,C中的Command[A, C]是其自身的子类型(即UserCommandSystemCommand)?

注意:我省略了C的下/上类型边界 - 正如问题所暗示的,我不确定如何以编译的方式表达这一点,或者我是否在Scala中特别缺少某个功能旨在解决这类循环问题。

trait CommandPrerequisite[-A, +C] {
   val command: C
   def isValid(aggregate: A): Boolean
}

trait Command[A, C] {
   def prerequisites: List[CommandPrerequisite[A, C]]
}

trait SystemCommand extends Command[System, SystemCommand] {
   // System specific definitions.
}

trait UserCommand extends Command[User, UserCommand] {
   // User specific definitions.
}

1 个答案:

答案 0 :(得分:3)

您可能想要 f-bounded多态。您需要更改的是trait Command

的签名
trait Command[A, C <: Command[A, C]] {