2017-06-15 12 views
0

私はパラメータ化タイプを持つクラスを持っているエキスは、Scalaでは、自己のタイプ

abstract class Worker[T] { 
    def conf1: ... 
    def conf2: ... 
    def doWork ... 
} 

abstract class SpecializedWorker[T: TypeTag] extends Worker[T] { 
    //some behavior overriden (used fields from Trait that i want create) 
} 

私は労働者に混合することができる形質を作成したいをパラメータ化。

trait Extension { 
    self: Worker[_] =>  

    def someParameter: ... // only several workers can have that. thats why i need trait 
    def produceSpecializedWorker = new SpecializedWorker[???]() {} 
}  

自己から型情報を抽出する方法???

trait Extension { 
    self: Worker[_] =>  
    def mkSpWorker[T](implicit ev: this.type <:< Worker[T]) = new SpecializedWorker[T]() {} 
} 

しかし、私はあなたがExtensionで使用することができWorkerで型のメンバを定義することができます:)ことをお勧めしません。ここで

+2

質問を明確にしていただけますか?自己から労働者のタイプを抽出したいのですか?なぜあなたは 'trait Extension [T] {self:Worker [T]}'をしませんか? –

+0

私はタイプTを2回設定する必要があるので。回避策はありますが、明確ではありません 'class SomeWorkerはWorker [SomeCaseClass]を拡張子[SomeCaseClass]で拡張します ' –

+0

*" set type T twice? " –

答えて

1

は、型パラメータを抽出する方法です。

abstract class Worker[T] { 
    type TT = T 
} 

trait Extension { 
    self: Worker[_] =>  
    def mkSpWorker = new SpecializedWorker[TT]() {} 
} 

また、Extensionに型パラメータを指定することもできます。それほど大きな問題ではないと私は思う。

+0

の壮大な魔法の呪文で拡張します。ありがとう:-) –

関連する問題