【问题标题】:Scala - type mismatch problem with own type (String) and FutureScala - 与自己的类型(字符串)和未来的类型不匹配问题
【发布时间】:2020-07-14 11:43:55
【问题描述】:

我有一个方法,需要String 类型作为参数:

type Identity = String
case class RequireSmth(param: Identity) extends Something

现在我以更复杂的顺序调用此方法:

createMe(as[List])(arg =>{ parse(RequireSmth(getAction(name, surname).map(bool => getData(surname, bool).id))) })

Parse 看起来像:

def parse(ob: Something)

地点:

def getAction(name: String, surname: String): Future[Boolean] = {
    someObject.get(name).map(_.getSomething(surname).isPossibleToTake.getOrElse(false)) //someObject is defined in constructor and does not matter here
}

def getData: (String, Boolean) => MyObject = {
    case ("Doe", true) => possible
    case _ => notPossible
}

MyObjectpossiblenotPossible 定义:

case class MyObject(id : String, name: String, surname: String)

val possible = MyObject( id = "ok", name ="John", surname = "Doe")
val notPossible = MyObject( id = "not ok", name ="John", surname = "Doe")

问题是,当我调用RequireSmth 方法时出现错误:

type mismatch;
found: scala.concurrent.Future[String]
required: com.my.smth.Identity (which expands to) String

如何解决这个问题以返回Identity(或String)而不是Future[String]

【问题讨论】:

    标签: scala future


    【解决方案1】:

    将信息保存在Future 中,如下所示:

    getAction(name, surname).map(bool => getData(surname, bool).id).map(RequireSmth)
    

    只需将操作链接在一起,将所有内容保存在 Future 中:

    getAction(name, surname)
      .map(bool => getData(surname, bool).id)
      .map(RequireSmth) // Or x => RequireSmth(x) if necessary
      .map(parse)
    

    在某些时候,您会遇到一个具有副作用并返回 Unit 的方法,并且会在 Future 中的所有操作完成时执行。

    万一您确实需要从Future 中获取值,请使用Await.result。但在大多数情况下,这不是必需的。

    【讨论】:

    • 但它会返回与我的解决方案相同的结果类型吗?
    • 我编辑了我的第一篇文章。我使用了您的解决方案,但在这里我在方法解析时出现编译错误:无法解析重载方法“解析”
    • 是的,看起来它没有返回相同的结果类型。我需要Something 但到了这里RequireSmth
    • 好的,我试试。如果我可以有类似的东西怎么办:create(as[Map])(arg =>parse(RequireSmth(...))。还可以像你那样做吗?
    【解决方案2】:

    你需要翻转方法调用:

    val res: Future[???] = 
       getAction(name, surname)
         .map(bool => getData(surname, bool).id)
         .map(RequireSmth)
         .map(parse)
    

    注意Future[String] 不是String,它是一个将来会产生一个值的计算,这意味着整个计算堆栈也需要返回一个Future[T](除非你明确地等待,哪些会阻塞且不推荐)。

    【讨论】:

    • 我编辑了我的第一篇文章。我使用了您和@Tim 的解决方案,但这里我在方法parse 上有编译错误:无法解析重载方法'parse'
    • @allocer parse 的签名是什么?它来自哪里?
    • 从你得到的错误来看,parse 是一个重载的方法?
    • 是的,方法比较复杂(我又编辑了一遍)。我用 Tim 的建议解决了解析问题。现在我需要翻转整个这个方法,但我不知道怎么做。
    • @allocer WDYM 翻转整个这个方法?什么需要翻转?
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2018-08-02
    • 2013-09-03
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多