Подтвердить что ты не робот

Akka mapTo против asInstanceOf

Я читаю Akka Futures Guide, и я вижу это предложение:

Также обратите внимание, что будущее, возвращаемое Актером, - это Будущее [Любое], поскольку Актер является динамичным. Вот почему asInstanceOf используется в приведенном выше примере. При использовании неблокирования лучше использовать метод mapTo, чтобы безопасно попытаться применить будущее к ожидаемому типу

Почему mapTo лучше использовать, чем asInstanceOf для неблокирующего Будущего?

4b9b3361

Ответ 1

Проблема с 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))

Ответ 2

Это не так, что mapTo лучше в этом случае, так как это asInstanceOf недоступно: их пример с asInstanceOf использует его для приведения результата от Any до String, но с не- -блочное будущее, у вас еще нет результата, даже как Any. Вместо этого у вас есть Future[Any], и вам нужно использовать его метод mapTo, чтобы обернуть его как Future[String].