【发布时间】:2018-05-21 12:07:51
【问题描述】:
我知道方法签名包括方法名称及其参数列表。
那么throws Exception呢?
public List<ServiceStatusVo> listServiceStatuses() throws RetrieverException {
...
return list;
}
如果不包含,那么为什么我不能传入以下 lambda:
() -> listServiceStatuses()
但我可以进去
() -> {
try {
return listServiceStatuses();
} catch (RetrieverException e) {
}
}
而且我也可以把它扔掉再次
() -> {
try {
return listServiceStatuses();
} catch (RetrieverException e) {
throw e;
}
}
我知道Supplier<T> 功能接口,这让我真正感到困惑如果 抛出 不是方法签名 的一部分。
感谢您的帮助。
【问题讨论】:
-
好像您已经回答了自己的问题,不是吗? Supplier.get() 不会抛出任何已检查异常,因此抛出已检查异常的 lambda 将不符合所需的类型。
-
@jspcal 我只是有这种感觉,但直到现在我还没有找到任何官方文档来指定它。你能提供一些细节吗?
-
@VictorGubin 我知道那篇描述如何处理这种情况的帖子,但我想知道的是为什么?
-
@VictorGubin 不是真的,没有什么可以阻止 lambda 抛出检查异常(例如
interface CheckedSupplier<T, E> { T get() throws E; });你不能把它扔给Supplier类型。
标签: java lambda java-8 functional-interface throws