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 A
和 C 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"
在典型的菱形问题层次结构中,我有四个特征 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 A
和 C 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"