我正在嘗試在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
逆變換的可重用性。
在此先感謝