我正在尝试在scala中构建行为树库,但我遇到了方差问题。下面是一个节点的简化版本:使用逆变类型参数为方法的类型参数和返回类型时的难度
sealed trait State[+O]
case class Running[+O](curOut: O, node: Node[O,_]) extends State[O]
case class Success[+O](out: O) extends State[O]
case object Failure extends State[Nothing]
trait Node[-I,C] {
protected def canRun(item: I, context: C, tick: Int): Boolean
protected def run[O <: I](item: I, context: C, tick: Int): State[O]
def apply[O <: I](item: I, context: C, tick: Int): State[O] = {
if (canRun(item, context, tick)) run(item, context, tick)
else Failure
}
}
每当我试图然而实例Node
,它抱怨说method run overrides nothing
:
val node = new Node[Int,Any] {
override protected def run(item: Int, context: Any, tick: Int): State[Int] = ???
override protected def canRun(item: Int, context: Any, tick: Int): Boolean = ???
}
我试图改变O
在Node
一种类型的成员,但该抱怨Covariant I is used in contravariant position
:
type O <: I
我想问的是如何我可以使用反变量类型参数作为方法参数和方法返回类型的类型吗?理想情况下,我不希望在父节点和装饰节点中使用I
逆变换的可重用性。
在此先感谢