请发布您的导入和您引用的文档。
我认为与理解这一点最好的平行是:
Try[T] 就像Option[T],Try[T] 总是Success[T](value: T) 或Failure[T](exception: Throwable),就像Option[T] 总是Some[T](value: T) 或None
在这样的事情上使用 Scala REPL 也很有帮助。它使您可以轻松查看类型。
我假设你已经这样做了:
scala> import scala.concurrent.Future
import scala.concurrent.Future
scala> import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global
scala> import scala.util.{Failure, Success}
import scala.util.{Failure, Success}
现在你有两条线了:
scala> val a = Future { Thread.sleep(10*1000); 42 }
val a: scala.concurrent.Future[Int] = Future(<not completed>)
scala> val b = a.map(_ * 2)
val b: scala.concurrent.Future[Int] = Future(<not completed>)
您可以看到b 的类型仍然是scala.concurrent.Future[Int],因为它使用函数(_: Int -> _ * 2):Int 映射了a 的结果Int,恰好是42。
最终:
scala> b
val res0: scala.concurrent.Future[Int] = Future(Success(84))
来自this documentation of Scala Futures:
请注意,您期望的 84 被包裹在 Success 中,而后者又被包裹在 Future 中。这是要知道的关键点:Future 中的值始终是Try 类型之一的实例:Success 或Failure。因此,在处理 future 的结果时,请使用常用的Try-handling 技术,或其他 Future 回调方法之一。
最后,从未来中提取Try,要么是Success要么是Failure,我们将从中得到我们的结果,或者一个错误:
scala> b.onComplete {
| case Success(value) => println(s"Got the callback, value = $value")
| case Failure(e) => e.printStackTrace
| }
Got the callback, value = 84