2017-09-04 2 views
1

ich das folgende Testverfahren habenAusnahme mit Scala Zukunft Umgang mit gescheiterten Szenario

def test() = { 
val aa = Future{10} map { 
    case x if x%2 == 0 => (x,x) 
    case _ => val kk = Future.failed(BadRequestException("dd")); kk 
} 
aa 
} 

Wenn ich die case _ dann der Rückgabetyp der Methode entfernen Future[(Int, Int)] ist das ist genau das, was ich will. Wenn ich jedoch das Szenario case _ hinzufüge, wird der Rückgabetyp Future[Object]. Ich bin nicht in der Lage zu verstehen, was ich ändern sollte, da andere ähnliche Methoden in unserer Codebasis ähnliche Dinge tun (ich bin sicher, dass mir etwas Subtiles fehlt) und der Rückgabetyp bleibt von der Natur Future[(Int, Int)]. Immer wenn ich eine Ausnahme für ein Szenario ausspreche, möchte ich nicht, dass der Rückgabetyp der Methode geändert wird. Was vermisse ich oder mache ich falsch?

Antwort

3

sollten Sie flatMap anstelle von map wie unten gezeigt verwenden. mit map Methode der Rückgabetyp case _ ist Future[BadRequestException] und für case x if x%2 == 0 der Rückgabetyp ist (Int, Int). Dies führt zu einem Netto-Return-Typ von Future[Object]. Dies kann korrigiert werden, indem die flatMap anstelle von map wie unten gezeigt verwendet wird.

def test() = Future{10} flatMap { 
    case x if x%2 == 0 => Future.successful((x,x)) 
    case _ => Future.failed(BadRequestException("dd")) 
} 
+0

oh Guter Fang, habe ich es jetzt, als eher als Rückkehr Tupel, ich Zukunft darauf zurückkommen und dann flatMapping es darum kümmert sonst werde ich 'Zukunft [Future..' bekommen. Ich verstehe diesen Teil. Was ich immer noch nicht verstehe, ist, warum ist der Compiler jetzt glücklich und stimmt dem Rückgabetyp zu, den ich möchte. – curiousengineer

+0

, weil in beiden Fällen die Rückgabetypen 'Future [(Int, Int)]' und 'Future [BadRequestException]' sind und die Vereinigung dieses Rückgabetyps 'Future [(Int, Int)]' ist. während in Ihrer ursprünglichen Kartenoperation zwei Rückgabetypen "Future [(Int, Int)]" und "Future [Future [BadRequestException]]" waren, was in einen Unionstyp von 'Future [Object]' –

+0

übersetzt wird. Wo kann ich darüber lesen ein bisschen mehr. Vielen Dank für diese präzise und klare Erklärung. Ich möchte darüber lesen, welche Union-Typen in welchem ​​ultimativen Typ – curiousengineer

Verwandte Themen