Я записал некоторые события в FSM и обнаружил кое-что, что не могу объяснить при сопоставлении с образцом. Я думал, что следующее было совершенно законным, то есть я могу отправить этому актеру либо сообщение, которое является вектором [A], либо вектором [B].
when(State) {
case Event(content: Vector[A], _) => {
println("matched A")
stay
}
case Event(content: Vector[B], _) => {
println("matched B")
stay
}
}
Однако, если я отправлю актеру сообщение 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 может соответствовать String, но печать java.lang.Integer. Итак, я должен думать об этом, как о том, что у меня есть вектор [Int], который я называю Vector [Any], поскольку Vector [Any] может быть Vector [String], он соответствует этому шаблону, и опять же, поскольку это действительно вектор [ Int] Я маскирую как Vector[Any], печать тоже в порядке.
Может ли кто-нибудь объяснить эти наблюдения сопоставления с образцом?
и как мне настроить сообщения, чтобы мое состояние могло обрабатывать как сообщения Vector[A], так и Vector[B]?
A
иB
? Можете ли вы опубликовать минимально воспроизводимый пример? - person Yuval Itzchakov   schedule 23.09.2016