如何使用Scala Actors同步发送摆脱向下转换?

时间:2011-06-19 19:32:28

标签: scala casting actor type-safety

假设,我向一个演员发送请求并同步接收它的响应:

case class MyRequest()
case class MyResponse(data:Any)

val resp = myActor !? MyRequest()

现在我必须将resp转发给MyResponse以访问data

val data = (resp.asInstanceOf[MyResponse]).data

我怎样才能摆脱强制转换并以类型安全的方式编写代码? (我想我可以使用模式匹配,但我更喜欢另一种解决方案)。

3 个答案:

答案 0 :(得分:4)

据我所知,Scala Actors没有打字。所以请使用支持typed actors的Akka演员。我之前也遇到过你的问题,并用隐式清单对其进行处理,以便在scala中获得某种类型的actor。

答案 1 :(得分:3)

模式匹配是从消息中获取数据并区分您收到的消息类型的常用方法。

我只想在这里使用模式匹配,我很好奇为什么你更喜欢另一种解决方案。

答案 2 :(得分:3)

演员没有输入,因此无法使用核心库进行操作。但是,有几种方法可以创建实用程序方法。

您可以在消息中对结果类型进行编码,然后使用实用程序方法:

trait Result[T]

class RichActor(self: Actor) {
    def !?![T](msg: Result[T]): T = (self !? msg).asInstanceOf[T]

    def !?![T](timeout: Long, msg: Result[T]) = (self.!?(timeout, msg)).asInstanceOf[Option[T]]
}

implicit def enrichActor(a: Actor) = new RichActor(a)

用法:

case class Message() extends Result[Int]

val i = actor !?! Message()

i的类型是Int

注意:之前发布在此处:http://www.tikalk.com/java/blog/type-safe-actor-messages