假设,我向一个演员发送请求并同步接收它的响应:
case class MyRequest()
case class MyResponse(data:Any)
val resp = myActor !? MyRequest()
现在我必须将resp
转发给MyResponse
以访问data
val data = (resp.asInstanceOf[MyResponse]).data
我怎样才能摆脱强制转换并以类型安全的方式编写代码? (我想我可以使用模式匹配,但我更喜欢另一种解决方案)。
答案 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