Scala Akka演员提问和类型安全 如何使用Akka Actor询问并维护类型安全?或者避免使用ask而代之以tells?

Scala Akka演员提问和类型安全 如何使用Akka Actor询问并维护类型安全?或者避免使用ask而代之以tells?,scala,asynchronous,akka,actor,future,Scala,Asynchronous,Akka,Actor,Future,在Akka Actor上调用?或ask时,将返回未来[Any],我必须通过未来.mapTo[MyType]进行显式转换 我不喜欢失去这种安全感。如果我直接使用Futures(没有参与者),我可以显式返回Future[MyType]并维护类型安全性 我的特定用例涉及一个参与者将其消息委托给两个子参与者,然后聚合这些参与者的结果并将其返回给父级的发送者。我父母的receive方法与Akka文档中的方法类似: 有更好的方法实现我的用例吗?试试。基本上,它们允许您使用强类型特征/接口与参与者交互,而不

在Akka Actor上调用
ask
时,将返回
未来[Any]
,我必须通过
未来.mapTo[MyType]
进行显式转换

我不喜欢失去这种安全感。如果我直接使用Futures(没有参与者),我可以显式返回
Future[MyType]
并维护类型安全性

我的特定用例涉及一个参与者将其消息委托给两个子参与者,然后聚合这些参与者的结果并将其返回给父级的发送者。我父母的receive方法与Akka文档中的方法类似:

有更好的方法实现我的用例吗?

试试。基本上,它们允许您使用强类型特征/接口与参与者交互,而不是通过交换消息。在幕后,Akka使用动态代理实现这些接口,并实现异步魔法

类型化参与者可以返回具有不同强类型返回值的方法(来自上述文档):


这些方法代表了
tell
,而剩下的方法则是不同口味的
ask
我想发布一个新的答案,因为@Roland Kuhn最近提出了一个新的解决方案,称为类型化频道:

val f: Future[MyType] = actor <-?- message

val f:Future[MyType]=演员怎么样?谢谢。我一定错过了文件中的那一点——它们似乎符合要求。“何时使用类型化演员”一节和链接的博客文章都是很好的读物,并且很好地说明了演员为什么没有类型化。我现在在想,我会尽量与非类型演员合作。如果你作为一个答案发布,我会接受的。输入的演员不需要为动态代理的东西增加一些额外的成本吗?只是想知道…是的,代理、包装消息和在封面下使用未来都是有成本的。类型化的参与者将被弃用:似乎类型化频道实验最终只是一个实验。Akka 3计划采用不同的解决方案(有关更多信息,请参阅)
def squareDontCare(i: Int): Unit //fire-forget

def square(i: Int): Future[Int] //non-blocking send-request-reply

def squareNowPlease(i: Int): Option[Int] //blocking send-request-reply

def squareNow(i: Int): Int //blocking send-request-reply
val f: Future[MyType] = actor <-?- message