Scala嵌套for推导式与Future报错:value map is not a member of Any
解决Scala嵌套Future for推导式编译错误
问题原因
编译报错value map is not a member of Any的核心是if-else分支类型不统一:
- 当
c为true时,内层for推导式返回Future[Boolean]类型; - 当
c为false时,直接返回Boolean类型的true。
Scala会将这两个分支的公共父类型推断为Any,而for推导式中o <-要求右侧是支持flatMap/map的Future类型,Any没有这些方法,因此编译失败。
修正方案
将else分支的true包装为Future.successful(true),让整个if-else表达式的类型统一为Future[Boolean],代码如下:
import scala.concurrent.Future import scala.concurrent.ExecutionContext.Implicits.global def getVal(v: Int): Future[Double] = { Future(scala.math.sqrt(v >> 3)) } val c = true val t = for { x <- getVal(60) y <- getVal(52) o <- if (c) { for { a <- getVal(10) b <- getVal(5) } yield a > b } else Future.successful(true) } yield x >= y && o
说明
Future.successful会创建一个已完成的Future,直接返回传入的常量值,既保持了逻辑的正确性,又让if-else的两个分支类型完全匹配,for推导式可以正常执行flatMap操作,从而解决编译错误。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

