我在akka中创建了一些用作消息的案例类。
当程序收到一些消息时,它调用方法asInstanceOf[]
,但我不知道要在括号内放什么,因为消息可以是3个不同的案例类之一。
这是一个尝试:
abstract class Retour
case class Naissance(val sender : ActorRef) extends Retour
case class NaissanceEtMort(val sender : ActorRef) extends Retour
case class PlusUnMoisOK(val sender : ActorRef) extends Retour
但在执行我的程序时,我收到此错误消息:
lapins.Clapier$PlusUnMoisOK$ cannot be cast to lapins.Clapier$Retour
你可以帮帮我吗?
编辑:
错误的行是[Retour]中的那些:
val future = ask(couple,PlusUnMois)
val result = Await.result(future,timeout.duration).asInstanceOf[Retour]
,错误如下:
[ERROR] [07/02/2015 01:33:48.436] [clapier-akka.actor.default-dispatcher-5] [akka://clapier/user/$a] lapins.Clapier$PlusUnMoisOK$ cannot be cast to lapins.Clapier$Retour
akka.actor.ActorInitializationException: exception during creation
EDIT2:
解决!发送的邮件写得不正确:的确,我写了#34;发件人! PlusUnMoisOK"而不是"发件人! PlusUnMoisOK(个体)"
答案 0 :(得分:1)
您可以对未来的结果进行模式匹配。类似的东西:
Await.result(future, timeout.duration) match {
case n: Naissance => // ...
case nm: NaissanceEtMort => // ...
case pm: PlusUnMoisOK => // ...
}
答案 1 :(得分:1)
使用:
ask(couple,PlusUnMois)
您正在发送课程PlusUnMois
作为消息。如果您在couple
演员Await.result
中执行相同操作,则返回班级PlusUnMois
而不是PlusUnMois
的对象。尝试将课程PlusUnMois
转换为Retour
会导致错误。尝试发送PlusUnMois
的实例,例如:
val future = ask(couple,new PlusUnMois(someActorRef))
同样应该在你的couple
演员中完成:
sender ! new PlusUnMois(someOtherActorRef)
此外,考虑使用模式匹配,而不是使用asInstanceOf
:
Await.result(future,timeout.duration) match {
case m : Naissance => // do something Naissance
case m : NaissanceEtMort => // do something NaissanceEtMort
case m : PlusUnMoisOK => // do something PlusUnMoisOK
}