14

Akka Futures Guideを読んでいると、次の文が表示されます。

また、Actor は動的であるため、Actor によって返される Future は Future[Any] であることに注意してください。そのため、上記のサンプルでは asInstanceOf が使用されています。ノンブロッキングを使用する場合は、 mapTo メソッドを使用して Future を期待される型に安全にキャストすることをお勧めします

ノンブロッキング Future で asInstanceOf よりも mapTo を使用する方が良いのはなぜですか?

4

2 に答える 2

21

ここでの問題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))
于 2013-02-18T08:17:39.210 に答える
7

mapToその場合、それが利用できないため、それほど優れているわけでasInstanceOfはありません.withの例では、からasInstanceOfの結果をキャストするためにそれを使用していますが、非ブロックの未来では、. 代わりに があり、そのメソッドを使用して としてラップする必要があります。AnyStringAnyFuture[Any]mapToFuture[String]

于 2013-02-18T05:29:01.127 に答える