我在玩scala(scala 2.8)。假设我有一个具有嵌套特征的类,并且想将该嵌套特征用作类的构造函数中参数的类型。那有可能吗?这是我最近来的:

class OuterClass(traitParam:OuterClass#InnerTrait) {
  trait InnerTrait { }
  val y:InnerTrait = traitParam
}


没有第三行甚至可以编译,但是当我尝试实际将traitParam用作InnerTrait时,我得到了编译器错误:


类型不匹配;找到:OuterClass#InnerTrait必需:OuterClass.this.InnerTrait。


我不知道该怎么办(如果有的话)。在做

class OuterClass(traitParam:OuterClass.this.InnerTrait)


而是,如错误消息可能会建议,它不会编译。除了将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
}

10-07 13:28