我在 FSM 中编写了一些事件,并在模式匹配时发现了一些我无法解释的东西。我认为以下内容是完全合法的,即我可以向该参与者发送消息,该消息是向量 [A] 或向量 [B]。
when(State) {
case Event(content: Vector[A], _) => {
println("matched A")
stay
}
case Event(content: Vector[B], _) => {
println("matched B")
stay
}
}
但是,如果我向 actor 发送一个 vector[B] 消息,它会导致
java.lang.ClassCastException: B cannot be cast to A
所以基本上它会尝试匹配第一个事件,即使下一个会匹配。
我试图做一个更简单的模式匹配示例;
object Pattern extends App {
val n = Vector(1,2,3)
val s = Vector("S", "S", "S")
n match{
case e:Vector[String] => println("matched string")
case v:Vector[Int] => println("matched int")
}
}
这实际上是不合法的;
Error:(8, 12) pattern type is incompatible with expected type;
found : Vector[String]
required: scala.collection.immutable.Vector[Int]
case e:Vector[String] => println("matched string")
但是,如果我执行以下转换,我可以运行我的代码;
object Pattern extends App {
val n = Vector(1,2,3).asInstanceOf[Vector[Any]]
val s = Vector("S", "S", "S")
n match{
case e:Vector[String] => println(n(0).getClass)
case v:Vector[Int] => println("matched int")
}
}
我觉得奇怪的是,我显然说 Any 可以匹配一个字符串,但打印的是 java.lang.Integer。所以我应该认为它是因为我有一个向量 [Int],我说它是一个向量 [Any],因为向量 [Any] 可能是一个向量 [字符串],它与该模式匹配,并且再次因为它确实是一个向量 [ Int] 我屏蔽为 Vector[Any] 打印也很好。
有人可以解释这些模式匹配观察吗?
以及我应该如何设置消息以便我的状态可以同时处理 Vector[A] 和 Vector[B] 的消息?