ここでの問題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))