我从 Miles Sabin 要点示例中创建了此类标记类型:
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 @@ B
和 String @@ C
类型,因为 B
和 C
扩展 E
。我该怎么做?我尝试使 @@
协变:
type Tagged[U] = { type Tag = U }
type @@[T, +U] = T with Tagged[U]
但这没有帮助 - 我只能传递 String @@ E
类型的对象。
最佳答案
怎么样
def f[T <: E](e: String @@ T) = println(e)
f(b("1")) // 1
f(c("2")) // 2
?
关于scala - 标记类型中的协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36541740/