我可以在Scala中引用一个抽象类型成员的字段,例如
abstract class C {
type T
val t: T
}
但似乎我不能对构造函数参数做同样的事情:
abstract class C(t: T) { // not found: type T
type T
}
为什么?
答案 0 :(得分:3)
类的第一行定义是构造函数,因此它独立于类的给定实现(因为您正在构建它,您还不能知道抽象类型成员)。
但是,您可以做的是为您的类提供一个类型参数:
abstract class C[T](c: T) {
}
这样T
可以在构造函数中使用(现在只是一个类型相关的方法)。请注意,类型参数和成员是两个不同的东西,所以你不能这样做:
val stringC = new C("foo") {} // the {} enables instantiation of abstract classes
val other: stringC.T = "bar"
如果要使用stringC.T
表示法,则需要定义一个等于类型参数的类型成员:
class C[A](c: A) {
type T = A
}