4

我想定义一些描述不同树节点的特征,如下所示:

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)
    }
}

你能解释一下,为什么这段代码不能编译吗?怎么了?

4

1 回答 1

4

P中定义的类型HasParent是抽象类型。这意味着每个都HasParent可以有另一种类型P,只要它满足(上)类型界限。

当你用 a调用一些setParent时,你不能保证它具有那个特定的所需类型。 HasParentTthisHasParent

你确定你不想写:

type P = Node with HasChildren
于 2013-04-30T21:05:24.283 回答