2013-02-18 68 views
14

我在看Akka Futures Guide,我看到這樣一句話:阿卡mapTo與asInstanceOf

還要注意的是男演員返回的未來是一個未來的[任何]因爲一個演員是動態的。這就是爲什麼asInstanceOf用於上面的示例。當使用非阻塞時,最好使用mapTo方法來安全地嘗試將Future轉換爲預期類型

爲什麼mapTo比asInstanceOf更適合用於非阻塞Future?

回答

21

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)) 
7

它與其說mapTo是在這種情況下更好,因爲這asInstanceOf是不可用的:他們與asInstanceOf例如用它來結果轉換從AnyString,但有無阻塞的未來,你沒有結果呢,甚至作爲一個Any。相反,您有一個Future[Any],並且您需要使用其mapTo方法將其包裝爲Future[String]