我正在玩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
中使用。如果我把它移到外面,那么每次引用内部特征时我都要重新设置类型参数。
答案 0 :(得分:7)
您遇到了Scala的路径依赖类型。您的val y: InnerTrait
类型特定于其所包含的实例。 OuterClass#InnerTrait
是InnerTrait
所有实例的所有OuterClass
现存的超类型。
尝试使用此功能:
class OuterClass(traitParam: OuterClass#InnerTrait) {
trait InnerTrait { }
type IT = OuterClass#InnerTrait
def m1: IT = traitParam
}
答案 1 :(得分:1)
OuterClass有类型参数 然后将在InnerTrait中使用
因此可以使a: OuterClass
和b: 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}}。鸡蛋问题。
这种设计有些奇怪,所以我建议你重新考虑一下。