【问题标题】:scala Future onComplete method signature understandingscala Future onComplete 方法签名理解
【发布时间】:2013-11-23 14:58:02
【问题描述】:
trait Future[T]{
    def onComplete( callback: Try[T] => Unit )(...):Unit
}

trait Socket{
    def sendToEurope( packet:Array[Byte] ):Future[Array[Byte]]
}

val c:Future[Array[Byte]] = packet onComplete {
    case Success(p) => socket.sendToEurope(p)
    ....
}

这是从 coursera“反应式编程”的课堂笔记中引用的示例

我试图理解这里的方法签名。 onComplete 采用 Try => Unit 函数类型,而括号部分是 Success=>FutureType。我看不出这两种类型在这里是如何兼容的。考虑方差:Function1[-A,+R] 这使得 Success 兼容,但我在这里仍然看不到 Future 与 Unit 的协变。

谁能给我解释一下?

【问题讨论】:

    标签: scala


    【解决方案1】:

    您对代码的理解是正确的,它不会编译。

    Future.onComplete 返回一个 Unit,因此不能返回 Future[Array[Byte]],尽管它是 socket.sendToEurope 的返回类型。

    【讨论】:

      【解决方案2】:

      代码是正确的。如果 Unit 是预期类型,则任何值都将自动转换为 Unit。规则适用于这些类型的情况,否则您必须这样做:

      val c:Future[Array[Byte]] = packet onComplete {
          case Success(p) => socket.sendToEurope(p); ()
          ....
      }
      

      这会很丑。

      Scala: Why can I convert Int to Unit?

      【讨论】:

      • 我们这里不是从“X”转换为Unit,而是从Unit转换为“X”,这是不可能的。
      • 我指的是onComplete参数,我认为这是最初的问题。但是您对 onComplete 返回的值是正确的 - 它是 Unit,而不是 Future
      猜你喜欢
      • 2021-05-30
      • 2017-08-01
      • 2019-09-16
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 2018-04-17
      相关资源
      最近更新 更多