scala:没有可用于asInstanceOf []

时间:2015-07-02 21:34:19

标签: scala class inheritance

我在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(个体)"

2 个答案:

答案 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
 }