scala中类构造函数中的嵌套特征

Mic*_*cah 7 scala scala-2.8

我正在玩scala(scala 2.8).假设我有一个具有嵌套特征的类,并希望使用该嵌套特征作为类构造函数中参数的类型.这甚至可能吗?这是我最接近的:

class OuterClass(traitParam:OuterClass#InnerTrait) {
  trait InnerTrait { }
  val y:InnerTrait = traitParam
}
Run Code Online (Sandbox Code Playgroud)

没有第三行甚至编译,但只要我尝试实际使用traitParam作为一个InnerTrait我得到编译器错误:

类型不匹配; 发现:OuterClass#InnerTrait必需:OuterClass.this.InnerTrait.

我无法弄清楚我能做什么(如果有的话).干

class OuterClass(traitParam:OuterClass.this.InnerTrait)
Run Code Online (Sandbox Code Playgroud)

相反,正如错误消息可能暗示的那样,不会编译.除了移出InnerTrait外,我还有其他选择OuterClass吗?如果你想知道我为什么要这样做,答案就是在我的实际代码中,相当于OuterClass有类型参数,然后将用于InnerTrait.如果我将它移到外面,那么每次引用内部特征时我都必须重新设置类型参数.

Ran*_*ulz 7

您遇到了Scala的路径依赖类型.你val y: InnerTrait的类型特定于它所包含的实例.对于所有实例来说,它OuterClass#InnerTrait是所有InnerTrait现存的超类型OuterClass.

尝试使用此:

class OuterClass(traitParam: OuterClass#InnerTrait) {
    trait InnerTrait { }

    type IT = OuterClass#InnerTrait

    def m1: IT = traitParam
}
Run Code Online (Sandbox Code Playgroud)