2

を使用しAkka 2.1.0て、あるアクター ( ActorA) から別の ( ActorB) にメッセージを送信し、返されるメッセージがOption[(String, String)]. ActorBには val が an として定義されておりEnumeration、これが結果の 2 番目の要素として返されTupleます。 ActorAパターンを使用しAwait.result().asInstanceOf[Option[(String, String)](これが悪いブロッキング動作であることはわかっていますが、これが私が見ている動作を説明しているとは思いません)、結果を val に割り当てます。Tuple後で結果の 2 番目の要素を取り出そうとすると、scala.Enumeration#Val cannot be cast to java.lang.Stringキャスト例外が発生します。これは以前のバージョンでAkkaは表示されませんでしAkka 2.1.0Await.result。ここで何が起こっているのか誰でも説明できますか?

object MyEnumeration extends Enumeration {
  type Enum = Value
  val Foo = Value("foo")
  val Bar = Value("bar")
}

case class ActorA extends Actor {
  implicit val timeout = Timeout(10000)
  val result = Await.result((ActorB ? MyMessage), timeout.duration).asInstanceOf[Option[(String, String)]]

  val validResult = result.get
  val validType = validResult._2 // this is of type Enumeration#Val not String

}

case class ActorB extends Actor {
  def myType = MyEnumeration.Foo
  def receive = {
  case MyMessage =>
      sender ! Option((validString, myType))
  }
}
4

1 に答える 1

0

Akka 2.0.3 では実際には機能しませんでした。私が理解しているように、受信したメッセージを別の方法で解析しました。

// enum
object E extends Enumeration { val a,b,c = Value }

// send 
case "Hello" => sender ! Some(("Hai", E.a))

// works
Await.result(rootActor ? "Hello", timeout.duration)
.asInstanceOf[Option[(String, String)]] match {
  case a: Option[Tuple2[_, _]] => // diff is here 
    println("" + a.get._2)
    a.get._2
}  


// does not work
Await.result(rootActor ? "Hello", timeout.duration)
.asInstanceOf[Option[(String, String)]] match {
  case a: Option[Tuple2[String, String]] => // diff is here
    println("" + a.get._2)
    a.get._2
}  
于 2013-01-30T09:18:00.627 に答える