我正在阅读Akka Futures Guide并看到这句话:
另请注意,Actor 返回的 Future 是 Future[Any],因为 Actor 是动态的。这就是上面示例中使用 asInstanceOf 的原因。使用非阻塞时,最好使用 mapTo 方法安全地尝试将 Future 转换为预期类型
为什么 mapTo 比 asInstanceOf 更适合用于非阻塞 Future?
我正在阅读Akka Futures Guide并看到这句话:
另请注意,Actor 返回的 Future 是 Future[Any],因为 Actor 是动态的。这就是上面示例中使用 asInstanceOf 的原因。使用非阻塞时,最好使用 mapTo 方法安全地尝试将 Future 转换为预期类型
为什么 mapTo 比 asInstanceOf 更适合用于非阻塞 Future?
这里的问题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))
在这种情况下,这并不是mapTo
更好,因为那asInstanceOf
是不可用的:他们的示例asInstanceOf
使用它来将结果从Any
to 转换为String
,但是在非阻塞未来的情况下,您还没有结果,即使是Any
. 相反,您有一个Future[Any]
,并且您需要使用它的mapTo
方法将其包装为一个Future[String]
.