scala Future onComplete方法签名理解

时间:2013-11-23 14:58:03

标签: scala

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)
    ....
}

这个样本引用了课程说明“反应性编程”

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

有人可以向我解释这个吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

哪个会很难看。

请参阅Scala: Why can I convert Int to Unit?