Future.onComplete: 无法理解方法签名

Future.onComplete: can't understand the method signature

  /** When this future is completed, either through an exception, or a value,
   *  apply the provided function.
   *
   *  If the future has already been completed,
   *  this will either be applied immediately or be scheduled asynchronously.
   *
   *  $multipleCallbacks
   *  $callbackInContext
   */
  def onComplete[U](func: Try[T] => U)(implicit executor: ExecutionContext): Unit

基本用法似乎是:

  result.onComplete({
    case Success(listInt) => {
      //Do something with my list
    }
    case Failure(exception) => {
      //Do something with my error
    }
  })

这个函数似乎对产生副作用很有用,因为它是 returns 单位(比如日志完成) 我不明白的是函数 return 的这种类型 U 是什么。我们提供的return类型的功能真的有用吗? Scala是如何使用的?

同样的问题可能适用于 onSuccessonFailure

编辑: 为了更清楚,def onComplete[U](func: Try[T] => U)def onComplete(func: Try[T] => Unit) 有什么好处?


编辑:

Chirlo 说得对,U 类型的函数更灵活,我们可以更轻松地传递它现有的没有 return Unit 的函数。

type T = String

def onComplete[U](func: Try[T] => U): Unit = { }
def onComplete2(func: Try[T] => Unit): Unit = { }

// Existing function that does not return Unit
def log[T]( t : Try[T]): Int = 0

onComplete(log) // This compiles fine
onComplete2(log) // This does not compile

一个非常简单的例子应该清除云层

val a = Future(1/2)
a.onComplete[String]({
  case Success(1) => "StringValue"         
})

这里 U 是字符串并且 T在成功中是Int。

现在大多数情况下 scala 都知道数据类型是什么,我们不需要特别提到类型 U 和 T

如果我们将 String "StringValue" 更改为其他内容,上述示例将导致错误

val a = Future(1/2)
a.onComplete[String]({
  case Success(1) => 1
})

编译错误- 类型不匹配;发现:需要 Int(1):String

但是如果我们从 complete 中删除字符串并且不强制 return 类型为字符串,它将采用任何类型

val a=Future(1/2)
a.onComplete({
  case Success(1)=>1
  case Success(2) => "we found two"  
  case Success(3) => 1.0f
  case Success(_) => new RuntimeException("it was not expected")
})

编译得很好。 因此给了我们 return 多种类型的能力,这取决于你的用例

使功能更加灵活。如果它 return Unit,你可以只给它传递函数 Try[T] => Unit,但是通过 returning U,你可以给它传递任何需要 Try[T] 作为一个参数,你可能已经在身边了。例如:

def log[T]( t : Try[T]): Int =  //write to file and return 0  if Ok, else 128

此函数有副作用,但也 return 是一个值。您现在可以将此函数传递给您的 Future,尽管它不会 return Unit,结果将被丢弃,但您可以重用已经存在的函数。