我正在阅读Akka Futures Guide,我看到了这句话:
另请注意,Actor返回的Future是Future [Any],因为Actor是动态的。这就是为什么在上面的示例中使用asInstanceOf。使用非阻塞时,最好使用mapTo方法安全地尝试将Future转换为期望的类型
为什么mapTo比asInstanceOf更好地用于非阻塞Future?
答案 0 :(得分: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))
由于类型擦除,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))
答案 1 :(得分:7)
在这种情况下,mapTo
更好,因为asInstanceOf
不可用:asInstanceOf
的示例使用它将结果从Any
转换为String
Any
,但由于没有阻止未来,即使是Future[Any]
,您也没有结果。相反,您有mapTo
,并且需要使用其Future[String]
方法将其包装为{{1}}。