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
相关产品推荐
相关产品推荐

