2017-05-29 87 views
0

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

abstract class C { 
    type T 
    val t: T 
} 

但似乎我不能做同样的事,一个构造函数的参数:

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

为什么?

+0

为什么你不能这样做的主要原因是如何在scala中实现多态。回答你的问题将涉及相当多的领域,需要一些时间来解释。尝试阅读下一篇文章:https://twitter.github.io/scala_school/type-basics.html,并挖掘类型参数和隐式的如果需要更深入的了解。 – Pavel

回答

2

类的定义的第一行是一个构造函数,所以它与该类的给定实现无关(因为您正在构建它,您无法知道抽象类型成员)。

不过,你能做的就是给一个类型参数到类:

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 
}