2

在《Scala 中的函数式编程》一书中,有一段话讲到了“受检异常”:

已检查的异常

Java 的检查异常至少会强制决定是否处理或重新引发错误,但它们会导致调用者的大量样板文件。更重要的是,它们不适用于高阶函数,它们不可能知道它们的参数可能引发的特定异常。例如,考虑我们为 List 定义的 map 函数:

def map[A,B](l: List[A])(f: A => B): List[B]

这个函数显然很有用,高度通用,并且与检查异常的使用不一致——我们不能为每个可能由f. 即使我们想这样做,map 怎么会知道哪些异常是可能的呢?这就是为什么通用代码,即使在 Java 中,也经常求助于使用 RuntimeException 或一些常见的检查异常类型。

这部分我读了好几遍,但仍然不清楚为什么受检异常不适用于高阶函数

有人可以举一些例子让它更清楚吗?

4

1 回答 1

6

尝试map<A, B>用 Java 编写函数。在某些时候,您会发现自己需要调用映射函数。您的映射函数可以是任何东西并抛出它喜欢的任何类型的异常。该函数map不能在其签名中包含映射器可以抛出的所有可能异常,因为它不知道它是什么。不可能编写map带有检查异常的类型签名。

假设 的签名map类似于Colletion<B> map<A, B>(Function<A,B>, Collection<A>)。现在假设我们称它为map(x -> throw new IOException, Lists.of(1,2,3)). 由于IOException被检查,它应该出现在的签名中,map但是在你调用之前map,它不知道它抛出这种类型的异常。

于 2015-07-14T09:46:44.823 回答