我是 Scala 的新手。我知道类型理论的基础。
问题是使用回调创建节点的图形对象。
以下是当前实现的简化版本。这是图书馆的一部分。
它有效,但充满Any
. 我认为摆脱 all 是不可能的Any
,但我怀疑有更好的方法。
特别是,CallbackNode
接受协变类型参数,但回调的类型是逆变的,则变为Any
.
但是回调在用户代码中无处不在,因此最好有类型A
以提高可用性。
让我知道您将如何针对此类问题进行设计。
trait Graph[N] {
var nodes: List[N]
var edges: List[Edge[N]]
def register(node: N) { nodes = node :: nodes }
def dependants(node: N): Seq[N] = { ... }
}
object MyGraph with Graph[CallbackNode[Any]] {
...
}
class CallbackNode[+A](getter: => A) {
var cache: Option[Any]
MyGraph.register(this)
def onChange(callback: Any => Unit) { ... }
def update() {
val v = getter
storeInCache(v)
dependants.foreach { n => n.notify() }
callbacks.foreach { c => c(v) }
}
...
}