加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Akka/Scala中使用mapTo和期货

发布时间:2020-12-16 18:57:14 所属栏目:安全 来源:网络整理
导读:我最近开始用Akka / Scala编码,我遇到了以下问题: 在范围内进行隐式转换,例如: implicit def convertTypeAtoTypeX(a: TypeA): TypeX = TypeX() // just some kinda conversion 这有效: returnsAFuture.mapTo[TypeX].map { x = ... } 但这不是: returnsAF
我最近开始用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有关,但我不知道要么猜到任何答案:(

谢谢!

解决方法

来自doc:

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,你问一个演员并收到回复Future [Any].但是你知道一个Actor会返回你的String,所以你可以安全地编写actor.ask(…).mapTo [String],这样就可以了,因为Any可以被转换为一切.此处不使用隐式转换.

现在你说你的第一个例子有效.但是这条线甚至没有计算,因为你从未要求过结果.为了可视化scala编译器说:你只做一个地图(从类型X改为Y型)这个未来的结果但从未真正使用它所以如果你不关心自己,为什么还要执行它呢?

如果您在第一行中的地图后添加了onComplete,则会看到相同的ClassCastException.

这可能是你想要的,但这很有趣:

returnsAFuture.map { x => x.fieldOnlyInTypeX }

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

?Krzysiek

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读