2017-12-07 2 views
-2

Ich habe ein Problem in Scala, wenn ich versuche, ein Ergebnis von einer Methode zurückzugeben.Future Any entspricht nicht Future E

Ich verwende Play 2.6 und ReactiveMongo.

Fehler in den Bildern unten:

enter image description here

enter image description here

jemand einige Hinweise geben könnte?

+0

Die zukünftige Zusammensetzung des Codes ist nicht wirklich gut strukturiert, eher für Verständnis und überprüfen Sie Ihre Arten. – cchantep

+0

@cchanstep ja, es ist nicht klar, ich denke daran, zum Verständnis zu verwenden, aber ich bin noch nicht sehr geschickt in Scala. und weißt du, was mein Problem verursacht? –

+0

Schlechte Zusammensetzung ist anfällig für Typfehler, speziell "result.map", die ansonsten eine "Einheit" von "printStackTrace" und eine "Entität: E" ergeben, so dass nur "Any" in diesen Fällen kohärent ist. – cchantep

Antwort

1

Future.map Methode ist die Annahme einer Funktion der Future 's Ergebnis, so für Ihren Code, es ist Mapping result' abzubilden s Future Ergebnis gleich:

result.map(writeResult: WriteResult => { 
    case Success => entity 
    case Failure(f) => f.printStackTrace() 
    }) 

Wie dem obigen Code, Sie sind versuchen, WriteResult und Unit zurückgeben, so ist der map Ergebnistyp Any, und geben Future[Any] Typ zurück. Also der Typ Mismatch Compile Fehler geworfen.

Eigentlich brauchen Sie: result.map(writeResult: WriteResult => entity). und Sie können aufrufen create Methode wie:

val res = create(entity) 
    res.onComplete { 
    case Success(e) => println(e) 
    case Failure(f) => f.printStackTrace() 
    } 
1

Ich vermute, dass das, was Sie wirklich wollen, ist Future.transform statt map. So etwas wie das

val result: Future[WriteResult] = ??? 
    result.transform(_ => entity, 
    e => { 
     e.printStackTrace() 
     e // or return here your custom wrapper exception 
    })