是否有针对类型擦除的解决方法?

Is there workaround against type erasure?

我想针对通用参数进行模式匹配。我写了下面的例子:

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()
}

我了解到 BC 参数被删除到它们的下限 A。也许有一些解决方法可以针对类型参数进行模式匹配?

您可以使用 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)
  }
}

为此,您需要将 trait 替换为抽象 class,因为 trait 不能具有带上下文边界的类型参数。

对于这种情况是的,有:添加import scala.reflect.ClassTag并将Tr的定义更改为

sealed abstract class Tr[A, B <: A : ClassTag, C <: A : ClassTag]

请注意,不会影响is/asInstanceOf