我在玩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
}