You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala方法返回类型不匹配:需Future[Either[...]],实际得到Unit

解决Scala中Future[Either]返回类型不匹配(实际返回Unit)的问题

你这段代码的核心问题是误用了onComplete方法:onComplete是副作用方法,它的返回值是Unit,而非你定义的Future[Either[FootballScore, CricketScore]],所以编译器会报类型不匹配。同时内部嵌套的onComplete也存在同样问题,且会导致Future结果被丢弃,无法成为方法的有效返回值。

修正后的代码

def calculateScore(penalties: Int): Future[Either[FootballScore, CricketScore]] = {
  calculatePenalties(penalties).flatMap { penalResponse =>
    if (penalResponse.valid) {
      // 若需要基于findNumberOfMatches的结果生成最终值,可在这里继续用map/flatMap处理
      findNumberOfMatches().map { _ =>
        Left(FootballScore(0, "Valid"))
      }
    } else {
      Future.successful(Left(FootballScore(0, "Invalid")))
    }
  }.recover { case ex =>
    log.error("Invalid penalties", ex)
    Left(FootballScore(0, "Invalid"))
  }
}

关键修正点

  • 用flatMap替代onComplete处理calculatePenalties的结果:flatMap会接收Future的成功值,并返回新的Future,保证整个调用链的返回值始终是Future类型。
  • 用map处理findNumberOfMatches()的结果:如果需要基于该方法的结果生成最终的Either,map可以将其结果转换为目标类型;若该方法返回的Future还需进一步异步处理,可改用flatMap。
  • 用recover捕获异常:替代原代码中onComplete的Failure分支,recover会捕获Future的失败异常,返回一个包装了异常处理结果的成功Future,完全符合方法的返回类型要求。
  • 所有分支统一返回Future[Either[...]]类型:确保方法的返回值与定义完全匹配。

内容的提问来源于stack exchange,提问作者Sushant Somani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:07:41