我想要模式匹配一个通用参数。我编写了以下示例:
new Cls().processA("") //prints B: C
sealed trait Tr[A, B <: A, C <: A]{
def getA(str: String): A
final def processA(str: String): Unit = getA(str) match {
case b: B => println(s"B: " + b)
case c: C => println(s"C: " + c)
}
}
sealed trait A
final case class B() extends A
final case class C() extends A
final class Cls extends Tr[A, B, C] {
override def getA(str: String): A = C()
}
我知道B
和C
参数被擦除到它们的下界A
。也许对类型参数的模式匹配有一些解决办法吗?
发布于 2018-09-24 06:34:42
对于本例是的,有:添加import scala.reflect.ClassTag
并将Tr
的定义更改为
sealed abstract class Tr[A, B <: A : ClassTag, C <: A : ClassTag]
请注意,这不会影响is/asInstanceOf
。
发布于 2018-09-24 06:33:38
您可以使用ClassTag
,这样就可以在运行时检查它。
import scala.reflect.ClassTag
sealed abstract class Tr[A, B <: A : ClassTag, C <: A : ClassTag]{
def getA(str: String): A
final def processA(str: String): Unit = getA(str) match {
case b: B => println(s"B: " + b)
case c: C => println(s"C: " + c)
}
}
为此,您需要用抽象类替换属性,因为特征不能具有具有上下文边界的类型参数。
https://stackoverflow.com/questions/52481258
复制相似问题