gpt4 book ai didi

scala - 在 Akka/Scala 中使用带有 future 的 mapTo

转载 作者:行者123 更新时间:2023-12-03 03:40:55 25 4
gpt4 key购买 nike

我最近开始使用 Akka/Scala 进行编码,遇到了以下问题:

在范围内进行隐式转换,例如:

implicit def convertTypeAtoTypeX(a: TypeA): TypeX =
TypeX() // just some kinda conversion

这有效:

returnsAFuture.mapTo[TypeX].map { x => ... }

但这不是:

returnsAFuture.mapTo[TypeX].onComplete { ... }

后者因类型转换异常而失败。 (即 TypeA 无法转换为 TypeX)

非常困惑。为什么?我怀疑这与 Try 有关,但我对其中任何一个都了解不够,无法猜测任何类型的答案:(

谢谢!

最佳答案

来自文档:

def mapTo[S](implicit tag: ClassTag[S]): Future[S]  
Creates a new Future[S] which is completed with this Future's result if that conforms to S's erased type or a ClassCastException otherwise.

此函数只能用于在具有某种继承关系的对象之间进行转换。它不期望任何隐式证据从 [T] 转换为 [S](它甚至不知道 T!)

该函数用于例如在 Akka 中,你询问一个 actor 并收到 Future[Any] 的响应。但你知道 Actor 会返回 String,这样你就可以安全地写 actor.ask(...).mapTo[String]这会起作用,因为 Any 可以转换到一切。这里没有使用隐式转换。

现在您说您的第一个示例有效。但这条线甚至没有被计算,因为您从不请求结果。为了形象化,Scala 编译器说:好吧,你只是在这个 future 的结果上做一个映射(从类型 X 更改为类型 Y),但你从未真正使用它,所以如果你不这样做,为什么还要执行它呢?关心自己吗?

如果您在第一行的 map 后面添加了 onComplete,您将看到相同的 ClassCastException。

这可能就是您现在想要的,但这很有趣:

returnsAFuture.map { x => x.fieldOnlyInTypeX }

如果您使用“x”,就好像它是 TypeX 类型一样,一切都会正常工作。Scala 编译器将对“x”应用隐式转换,将其转换为 TypeX。这可能不是您想要的,因为“x”仍然是 TypeA 类型,并且在 map 中每次使用时都会通过隐式转换。

~克日西克

关于scala - 在 Akka/Scala 中使用带有 future 的 mapTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29314093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com