dre*_*xin 21
asInstanceOf这里的问题是,它只会转换为你想要的任何东西
scala> val f = future { 2 }
f: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@69b28a51
scala> f.asInstanceOf[Future[String]]
res9: scala.concurrent.Future[String] = scala.concurrent.impl.Promise$DefaultPromise@69b28a51
scala> f.asInstanceOf[Future[List[String]]]
res10: scala.concurrent.Future[List[String]] = scala.concurrent.impl.Promise$DefaultPromise@69b28a51
scala> res10.value
res15: Option[scala.util.Try[List[String]]] = Some(Success(2))
Run Code Online (Sandbox Code Playgroud)
由于类型擦除,jvm不知道值的具体内部类型.如果你使用mapTo它,它将直接转换为值,一旦它可用,如果是不匹配的类型,你将来会失败.
scala> f.mapTo[List[String]]
res11: scala.concurrent.Future[List[String]] = scala.concurrent.impl.Promise$DefaultPromise@2828afbb
scala> res11.value
res14: Option[scala.util.Try[List[String]]] = Some(Failure(java.lang.ClassCastException:
Cannot cast java.lang.Integer to scala.collection.immutable.List))
Run Code Online (Sandbox Code Playgroud)
mapTo在这种情况下,并不是那么好,因为那asInstanceOf是不可用的:他们asInstanceOf使用它来将结果转换Any为String,但是在没有阻塞的未来的情况下,你还没有得到结果,即使它是一个Any.相反,你有一个Future[Any],你需要使用它的mapTo方法将其包装成一个Future[String].