Scala 钻石概率,从 class D 的实例中找到 class 名称

Scala diamond prob, find class name from instance of class D

在典型的菱形问题层次结构中,我有四个特征 A、B、C 和 D。 我在 trait A 中实现了一个计算方法,它检查 callerObject 的实例,执行一些计算和 returns trait A 类型对象。当 callerObject 属于特征 B 或 C 但不适用于特征 D 的对象时,计算方法能够成功地检查 callerObject 的实例类型,我得到以下 class 转换异常:

java.lang.ClassCastException: packageName.B$$anon cannot be cast to packageName.D

能否请您提出前进的方向,我如何在特征 A 的方法中检查特征 D 中对象的类型。

PS: 我是 Scala 的新手。

模式匹配 case 语句的顺序很重要。确保最具体的 class 始终在顶部匹配。例如,如果 B extends AC extends B,这意味着 C 的对象将始终匹配任何查找 B 或 A 的对象,等等。

这是一个玩具示例,可以更好地解释解决方案:

sealed trait A {
   def calculate(i: A) = i match {
      case _:D => "d" // Make sure the D is checked first!
      case _:B => "b"
      case _:C => "c"
      // If you want to match for A make sure it is added last
   }
}
trait B extends A
trait C extends A
trait D extends B with C

这是 REPL 中的示例:

val b = new B{}
val c = new C{}
val d = new D{}

b.calculate(b)
res> "b"
b.calculate(c)
res> "c"
b.calculate(d)
res> "d"