2016-04-11 56 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