使用Pekko(Akka)AskPattern的类型推断问题

wvyml7n5  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(234)

我使用Ask模式来实现简单的RPC。

  1. import org.apache.pekko.actor.typed.{ActorRef, Scheduler}
  2. import org.apache.pekko.actor.typed.scaladsl.AskPattern.Askable
  3. import org.apache.pekko.util.Timeout
  4. import scala.concurrent.{ExecutionContext, Future}
  5. case class RequestMessage(replyTo: ActorRef[ReplyMessage])
  6. case class ReplyMessage(ok: Boolean)
  7. def Fails(handler: ActorRef[RequestMessage])(using ExecutionContext, Timeout, Scheduler): Future[Boolean] =
  8. handler.ask(rt => RequestMessage(rt)).map(_.ok)
  9. def Ok(handler: ActorRef[RequestMessage])(using ExecutionContext, Timeout, Scheduler): Future[Boolean] =
  10. handler.ask[ReplyMessage](rt => RequestMessage(rt)).map(_.ok)

函数Fails给出以下错误:

  1. value ok is not a member of Any
  2. handler.ask(rt => RequestMessage(rt)).map(_.ok)

函数Ok设置ask的类型参数,并且不会给予错误。
为什么Scala 3不能为ask推断出正确的返回类型,有没有比显式命名类型更简单的方法来解决这个问题?

r55awzrz

r55awzrz1#

我想,这是因为ActorRef是反变的:ActorRef[Any]是匹配类型的“最具体”的子类,所以它与它一起使用我认为没有任何更干净的方法来使用ask反模式🤷。(有些人)称之为反模式是有原因的:)

相关问题