发现 scala 类型不匹配 Future[A] 预期 Future[B]

Posted

技术标签:

【中文标题】发现 scala 类型不匹配 Future[A] 预期 Future[B]【英文标题】:scala type mismatch found Future[A] expected Future[B] 【发布时间】:2020-10-17 08:27:00 【问题描述】:

对 scala 有点陌生,对这里的类型定义以及如何解决它有点困惑。

  private def getContract(organizationId: String, sc: SecurityContext): Future[Contract] = 
    val configRequest = ConfigsActor.ReadConfigRequest(CONFIG_KEY, Option(organizationId))(sc)
    (configActor ? configRequest).mapTo[Config] andThen 
      case Success(config) =>
        JsonUtil.extract[Contract](config.data)
      case otherwise =>
        log.warning("some unknown case has happened", otherwise)
    
  

我希望 akka 请求返回结果,将其映射到 Config。在我的 andThen 子句中将其转换为 Contract 类型并返回。

但我得到一个类型不匹配

[error] 
[error]  found   : scala.concurrent.Future[com.example.service.Config]
[error]  required: scala.concurrent.Future[com.example.service.Contract]
[error]     (configActor ? configRequest).mapTo[Config] andThen
[error]

【问题讨论】:

【参考方案1】:

Future#andThen 旨在执行副作用而不改变未来的价值。要转换 Future 中的值,只需映射未来

(configActor ? configRequest).mapTo[Config] map  config =>
  JsonUtil.extract[Contract](config.data)
 andThen  case Failure(e) => log.warning("some unknown case has happened", e) 

以下值得记住

someFuture
  .map      value  => /* transform value */ 
  .recover  error  => /* transform error */ 
  .andThen            /* execute side-effect */
    case Success(value) => logger.info("Successfully ...")
    case Failure(error) => logger.error("Failed to ...", error)
   

您可以将andThen 视为tap 对应于Futures。

【讨论】:

哦,有趣,好吧,让我试试。谢谢 谢谢你的回答,所以如果以后发生错误,map不会被调用,它会去恢复吗? @Pita 是的,成功的映射也是其他错误单子的常见模式,例如 Either、Option、Try 等。

以上是关于发现 scala 类型不匹配 Future[A] 预期 Future[B]的主要内容,如果未能解决你的问题,请参考以下文章

类型不匹配。必需:布尔值,在 Scala 中找到:Future[Boolean]

为啥 Scala 抱怨类型不匹配?

火花类型不匹配错误 - 发现:任何但必需:列表[重复]

Scala多态函数类型不匹配

带有 scala 的 mockito:匹配器问题

使用构造函数scala上的模式匹配键入不匹配