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的协变。
有人可以向我解释这个吗?
答案 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); ()
....
}
哪个会很难看。