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

在Scala中引用特征中的子类型,scala,generics,covariance,scala-2.10,contravariance,Scala,Generics,Covariance,Scala 2.10,Contravariance,在Scala中对泛型的广泛支持下,实现以下循环参数边界的最佳方法是什么,其中Command[A,C]中的C是其自身的一个子类型(即UserCommand或SystemCommand) 注意:我省略了C的类型下限/上限-正如问题所暗示的,我不确定如何以编译的方式表达这一点,或者我是否缺少Scala中专门用于解决这类循环问题的功能 trait CommandPrerequisite[-A, +C] { val command: C def isValid(aggregate: A): B

在Scala中对泛型的广泛支持下,实现以下循环参数边界的最佳方法是什么,其中
Command[A,C]
中的
C
是其自身的一个子类型(即
UserCommand
SystemCommand

注意:我省略了
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.
}
您可能需要f-有界多态性。您只需更改trait命令的签名:

trait Command[A, C <: Command[A, C]] {
trait-Command[A,C您可能需要f-有界多态性。您只需更改
trait-Command的签名即可:

trait Command[A, C <: Command[A, C]] {
trait命令[A,C]