引用Scala中类构造函数中的抽象类型成员

时间:2017-05-29 14:47:05

标签: scala type-members

我可以在Scala中引用一个抽象类型成员的字段,例如

abstract class C {
  type T
  val t: T
}

但似乎我不能对构造函数参数做同样的事情:

abstract class C(t: T) { // not found: type T
  type T
}

为什么?

1 个答案:

答案 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
}