Von doc:
def mapTo[S](implicit tag: ClassTag[S]): Future[S]
Creates a new Future[S] which is completed with this Future's result if that conforms to S's erased type or a ClassCastException otherwise.
Diese Funktion kann nicht verwendet werden, um zwischen Objekten zu konvertieren, die sich in einer Vererbungsbeziehung befinden.Es erwartet keinen impliziten Beweis für die Konvertierung von [T] nach [S]
Diese Funktion wird zB in Akka gebraucht, wo man einen Schauspieler fragt und als Antwort Fut erhält ure [Irgendwelche]. Aber du weißt, dass ein Schauspieler dir String zurückgibt, damit du sicher schreiben kannst actor.ask(...).mapTo[String]
und das wird funktionieren, weil Any zu allem gecastet werden kann. Implizite Konvertierungen werden hier nicht verwendet.
Jetzt sagen Sie, dass Ihr erstes Beispiel funktioniert. Aber diese Zeile wird nicht einmal berechnet, da Sie nie nach einem Ergebnis fragen. Um zu visualisieren, scala Compiler sagt: naja, Sie tun nur eine Karte (Wechsel von Typ X zu Typ Y) ein Ergebnis dieser Zukunft, aber nie tatsächlich verwenden, warum also stören Sie sogar ausführen, wenn Sie sich nicht kümmern?
Wenn Sie onComplete nach Ihrer Map in der ersten Zeile hinzugefügt haben, sehen Sie dieselbe ClassCastException.
Dies ist wahrscheinlich jetzt, was Sie wollen, aber das ist interessant:
returnsAFuture.map { x => x.fieldOnlyInTypeX }
wenn Sie „x“, als ob es vom Typ war TypeX alles gut funktionieren wird. Der Scala-Compiler wendet eine implizite Konvertierung in "x" an, um ihn in TypeX zu konvertieren. Dies ist wahrscheinlich nicht das, was Sie wollen, weil "x" immer noch vom Typ TypeA ist und implizit für jede Verwendung in map konvertiert wird.
~ Krzysiek
Jede Idee, was ist die Leistung von mapTo? – EugeneMi