2013-02-18 10 views
14

sto leggendo il Akka Futures Guide e vedo questa frase:Akka mapTo contro asInstanceOf

Si noti inoltre che il futuro restituito da un attore è un futuro [Qualsiasi] dal momento che un attore è dinamica. Questo è il motivo per cui asInstanceOf viene utilizzato nell'esempio sopra. In caso di utilizzo non bloccante è meglio utilizzare il metodo mapTo per cercare in modo sicuro di lanciare un futuro a un tipo previsto

Perché è mapTo meglio da usare rispetto asInstanceOf per un futuro non-blocking?

risposta

21

Il problema con asInstanceOf qui è, che sarà semplicemente gettato a tutto quello che vuoi

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

A causa della cancellazione di tipo JVM non conosce il tipo interno concreta del valore. Se si utilizza invece mapTo, verrà eseguito il cast direttamente sul valore, una volta disponibile e nel caso di un tipo non corrispondente, si otterrà un ritorno futuro non riuscito.

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

Non è tanto che mapTo è meglio in quel caso, come quello asInstanceOf non è disponibile: il loro esempio con asInstanceOf lo usa per lanciare il risultato Any-String, ma con un futuro non bloccante, non avete il risultato ancora, anche come Any. Invece, si dispone di un Future[Any] e è necessario utilizzare il suo metodo mapTo per avvolgerlo come Future[String].