2016-04-11 17 views
2

私はマイルセービン趣旨の例から、このようなタグ付きのタイプを作成しました:共分散

type Tagged[U] = { type Tag = U } 
    type @@[T, U] = T with Tagged[U] 

    sealed trait A 
    sealed trait E 
    sealed trait B extends E 
    sealed trait C extends E 
    def a(a: String): String @@ A = a.asInstanceOf[String @@ A] 
    def b(a: String): String @@ B = a.asInstanceOf[String @@ B] 
    def c(a: String): String @@ C = a.asInstanceOf[String @@ C] 

私は方法があります:

def f(e: String @@ E) = ??? 

を、私はこの方法では、両方のString @@ BString @@ C種類を取りたいですBCの両方がEに拡張されているためです。どうしたらいいですか?私は@@共変作ってみました:

type Tagged[U] = { type Tag = U } 
type @@[T, +U] = T with Tagged[U] 

を、それは助けにはならない - 私は唯一のタイプString @@ Eのオブジェクトを渡すことができます。

答えて

2

どの程度

def f[T <: E](e: String @@ T) = println(e) 
f(b("1")) // 1 
f(c("2")) // 2