2017-05-29 12 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は(今、ちょうど種類に依存する方法である)コンストラクタで使用することができるように。

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 
} 
関連する問題