我正在玩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.如果我将它移到外面,那么每次引用内部特征时我都必须重新设置类型参数.
您遇到了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)