2013-02-18 5 views
14

Ich lese die Akka Futures Guide und ich sehe diesen Satz:Akka mapTo gegen asInstanceOf

Beachten Sie auch, dass die Zukunft von einem Schauspieler zurück eine Zukunft [Alle], da ein Schauspieler dynamisch ist. Aus diesem Grund wird asInstanceOf im obigen Beispiel verwendet. Bei der Verwendung von nicht-blockierende es besser ist, die mapTo Methode zu verwenden, sicher zu versuchen, eine Zukunft zu einem erwarteten Typ

Warum ist mapTo besser zu werfen zu verwenden, als asInstanceOf für eine nicht-blockierende Zukunft?

Antwort

21

Das Problem mit asInstanceOf hier ist, dass es einfach zu etwas geworfen werden Sie

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

Wegen der Typ Löschung der Jvm nicht die Betoninnentyp des Wertes nicht kennt. Wenn Sie stattdessen mapTo verwenden, wird der Wert direkt umgewandelt, sobald er verfügbar ist, und im Falle eines nicht passenden Typs erhalten Sie eine fehlgeschlagene Zukunft zurück.

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

Es ist nicht so sehr, dass mapTo in diesem Fall besser ist, als dass asInstanceOf nicht verfügbar ist: ihr Beispiel mit asInstanceOf verwendet es das Ergebnis Any-String zu werfen, aber mit einer nicht-blockierende Zukunft, Sie haben nicht das Ergebnis noch, auch als Any. Stattdessen haben Sie eine Future[Any], und Sie müssen seine mapTo Methode verwenden, um es als Future[String] einzuschließen.