Akka mapTo与asInstanceOf

时间:2013-02-18 05:21:57

标签: scala akka future

我正在阅读Akka Futures Guide,我看到了这句话:

  

另请注意,Actor返回的Future是Future [Any],因为Actor是动态的。这就是为什么在上面的示例中使用asInstanceOf。使用非阻塞时,最好使用mapTo方法安全地尝试将Future转换为期望的类型

为什么mapTo比asInstanceOf更好地用于非阻塞Future?

2 个答案:

答案 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}}。