2016-03-31 8 views
3

定義された抽象タイプがClassTagになるように制約する型クラスを作成したいとします。ここでは簡単な例です:ClassTag型のClassTag

trait A[T] { 
    type B <: Z 

    val tag = implicitly[ClassTag[B]] 
} 

// Error:(8, 24) No ClassTag available for A.this.B 
// val tag = implicitly[ClassTag[B]] 
       ^

私はClassTag[B]を持っているBを必要と私はATのために暗黙的に利用できるようにしたいので、私はdef foo[T: A](t: T)のように、trait A[T, B: ClassTag]ようAを定義することはできません。 Bも上限にしてZにする必要がありますが、違いはありません。

BClassTagという制約がありますか?

+0

がhttp://stackoverflow.com/questions/を参照し9680630/use-context-bound-in-type-alias – slouc

答えて

4

ここではClassTagを提供する方法はありません。Bは最終的にどのような結末になるかわかりません。

それの代わりに抽象def行い、Aの具体的な実装は、それを提供してみましょう:

trait A[T] { 
    type B <: Z 
    def tag: ClassTag[B] // you may want to declare it as implicit 
} 

と、例えば、

new A[Int] { 
    type B = Z 
    def tag = implicitly 
} 
+0

ありがとう、それは私がやったことです。私は別の方法で行方不明だったと思った。 – serega

関連する問題