我在看Akka Futures Guide,我看到這樣一句話:阿卡mapTo與asInstanceOf
還要注意的是男演員返回的未來是一個未來的[任何]因爲一個演員是動態的。這就是爲什麼asInstanceOf用於上面的示例。當使用非阻塞時,最好使用mapTo方法來安全地嘗試將Future轉換爲預期類型
爲什麼mapTo比asInstanceOf更適合用於非阻塞Future?
我在看Akka Futures Guide,我看到這樣一句話:阿卡mapTo與asInstanceOf
還要注意的是男演員返回的未來是一個未來的[任何]因爲一個演員是動態的。這就是爲什麼asInstanceOf用於上面的示例。當使用非阻塞時,最好使用mapTo方法來安全地嘗試將Future轉換爲預期類型
爲什麼mapTo比asInstanceOf更適合用於非阻塞Future?
與asInstanceOf
這裏的問題是,它會簡單地強制轉換爲任何你想要
scala> val f = future { 2 }
f: scala.concurrent.Future[Int] = [email protected]
scala> f.asInstanceOf[Future[String]]
res9: scala.concurrent.Future[String] = [email protected]
scala> f.asInstanceOf[Future[List[String]]]
res10: scala.concurrent.Future[List[String]] = [email protected]
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]] = [email protected]
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
到String
,但有無阻塞的未來,你沒有結果呢,甚至作爲一個Any
。相反,您有一個Future[Any]
,並且您需要使用其mapTo
方法將其包裝爲Future[String]
。