为什么在类型成员中使用traits会在subtrait中给出“error:type mismatch”?

时间:2013-04-30 20:31:52

标签: scala traits

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

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

你能解释一下,为什么这段代码不能编译?有什么问题?

1 个答案:

答案 0 :(得分:4)

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

当您使用setParent部分 HasParent上致电T时,您无法保证this具有所需的特定类型HasParent

你确定你不想写:

type P = Node with HasChildren