我想定义一些描述不同树节点的特征,如下所示:
trait Node
trait HasParent {
this: Node =>
type P <: Node with HasChildren
def parent: P
def setParent(parent: P)
}
trait HasChildren {
this: Node =>
def children: Seq[Node]
protected def add[T <: Node with HasParent](child: T) {
child.setParent(this) // error: type mismatch;
// found : HasChildren with Node
// required: child.P
// child.setParent(this)
}
}
你能解释一下,为什么这段代码不能编译?有什么问题?
答案 0 :(得分:4)
P
中定义的HasParent
类型是抽象类型。这意味着每个HasParent
可以有另一个类型P
,只要它满足(上)类型绑定。
当您使用setParent
在部分 HasParent
上致电T
时,您无法保证this
具有所需的特定类型HasParent
。
你确定你不想写:
type P = Node with HasChildren