如何修复Scala(2.11)中路径依赖类型的类型不匹配错误?

时间:2018-05-18 09:04:35

标签: scala

我有这样的代码

trait Toy

trait Child {
    type T <: Toy
    def toys : Seq[T]
    def play(toys: Seq[T]): Unit
}

trait Parent {
    type C <: Child
    def firstChild: C
}

trait Home {
    def parent: Parent
    def toys: Seq[Parent#C#T]
    def apply() = {
        val ts = toys
        parent.firstChild.play(toys)
    }
}

但是我无法编译它:

[error] .../module/common/src/main/scala/test/Debug.scala:21:32: type mismatch;
[error]  found   : Seq[test.Parent#C#T]
[error]  required: Seq[_12.T] where val _12: test.Parent#C
[error]         parent.firstChild.play(toys)

有没有办法在不将所有抽象类型转换为param-types的情况下修复此错误?

1 个答案:

答案 0 :(得分:2)

使其编译的一种方法是:

trait Toy

trait Child {
    type T <: Toy
    def toys : Seq[T]
    def play(toys: Seq[T]): Unit
}

trait Parent { parent =>
    type C <: Child
    val firstChild: C
}

trait Home {
    val parent: Parent
    def toys: Seq[parent.firstChild.T]
    def apply() = {
        val ts = toys
        parent.firstChild.play(toys)
    }
}

请记住,类型成员绑定到其外部实例。如果您给孩子玩具,它必须是专门针对该特定父母(parent.firstChild.T)的特定孩子的玩具,而不是任何潜在父母的潜在孩子(Parent#C#T)。