0
我可以在Scala中引用一个抽象类型成员的字段,例如,引用Scala中的类构造函数中的抽象类型成员
abstract class C {
type T
val t: T
}
但似乎我不能做同样的事,一个构造函数的参数:
abstract class C(t: T) { // not found: type T
type T
}
为什么?
我可以在Scala中引用一个抽象类型成员的字段,例如,引用Scala中的类构造函数中的抽象类型成员
abstract class C {
type T
val t: T
}
但似乎我不能做同样的事,一个构造函数的参数:
abstract class C(t: T) { // not found: type T
type T
}
为什么?
类的定义的第一行是一个构造函数,所以它与该类的给定实现无关(因为您正在构建它,您无法知道抽象类型成员)。
不过,你能做的就是给一个类型参数到类:
abstract class C[T](c: T) {
}
这样T
可以在构造函数中使用(这仅仅是一个类型相关的方法,现在)。需要注意的是类型参数和成员是两种不同的东西,所以你不能做到这一点:如果你想使用stringC.T
符号
val stringC = new C("foo") {} // the {} enables instantiation of abstract classes
val other: stringC.T = "bar"
,你需要定义一个类成员等于你的类型参数:
class C[A](c: A) {
type T = A
}
为什么你不能这样做的主要原因是如何在scala中实现多态。回答你的问题将涉及相当多的领域,需要一些时间来解释。尝试阅读下一篇文章:https://twitter.github.io/scala_school/type-basics.html,并挖掘类型参数和隐式的如果需要更深入的了解。 – Pavel