2017-09-04 50 views
1

我有以下的测试方法异常Scala的未来处理失败的情况下

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

如果我删除case _那么方法的返回类型是Future[(Int, Int)]这正是我想要的。但是,当我添加case _方案时,返回类型将变为Future[Object]。我无法理解我应该改变什么,因为我们的代码库中的其他类似方法做类似的事情(我确信我错过了一些微妙的东西),并且返回类型保持为自然Future[(Int, Int)]。毕竟,当我为场景抛出一个异常时,我不希望方法的返回类型被改变。我错过了什么或做错了什么?

回答

3

您应该使用flatMap而不是map,如下所示。与map方法case _的返回类型是Future[BadRequestException]case x if x%2 == 0返回类型是(Int, Int)。这导致你有一个净回报类型Future[Object]。这可以通过使用flatMap而不是map来纠正,如下所示。

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

哦良好的渔获,现在我知道了,至于而不是返回元组,我可以在它返回未来,然后flatMapping它照顾它,否则我会得到'未来[Future..'。我明白那一部分。我仍然得不到的是,编译器为什么现在开心,并同意我想要的返回类型。 – curiousengineer

+0

,因为在这两种情况下,返回类型是Future [(Int,Int)]和Future [BadRequestException],这个返回类型的联合是Future [(Int,Int)]。而在你最初的映射操作中,两个返回类型是Future [(Int,Int)]和Future [Future [BadRequestException]],它转化为一个联合类型'Future [Object]' –

+0

我在哪里可以读到关于这个再来一点。非常感谢这样简洁明了的解释。我想了解哪些联盟类型会导致哪种终极类型 – curiousengineer