2017-05-29 126 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 
}