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

时间:2010-09-03 01:56:46

标签: scala scala-2.8

我正在玩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中使用。如果我把它移到外面,那么每次引用内部特征时我都要重新设置类型参数。

2 个答案:

答案 0 :(得分:7)

您遇到了Scala的路径依赖类型。您的val y: InnerTrait类型特定于其所包含的实例。 OuterClass#InnerTraitInnerTrait所有实例的所有OuterClass现存的超类型。

尝试使用此功能:

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

    type IT = OuterClass#InnerTrait

    def m1: IT = traitParam
}

答案 1 :(得分:1)

  

OuterClass有类型参数   然后将在InnerTrait中使用

因此可以使a: OuterClassb: OuterClass使这些类型参数不同。例如:

abstract class OuterClass[T] {
  val x: T
}

val a = new OuterClass[Int] { val x = 5 }
val b = new OuterClass[String] { val x = "abc" }

所以这就是难题...... InnerTrait必须绑定到OuterClass的实例,因为每个实例可能有不同的类型参数。但是,您希望将InnerTrait作为参数传递给OuterClass构造函数,因此您需要在InnerTrait之前构建OuterClass。但由于InnerTrait必须绑定到OuterClass的实例,因此必须在OuterClass之前构建InnerClass,将其转换为鸡和{1}}。鸡蛋问题。

这种设计有些奇怪,所以我建议你重新考虑一下。