在"Optional“源代码中,我发现了这个函数:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}我的问题是,如果我把这个函数改成这样,它看起来是一样的
public <X extends Throwable> T orElseThrow(Supplier<X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}有人知道原因吗?
发布于 2021-04-21 16:28:40
考虑以下方法:
void example() throws IOException {
throw new FileNotFoundException();
}它声明抛出一般的IOException,但具体抛出一个更具体的异常FileNotFoundException。
与orElseThrow相同:通过接受上限供应商,它可以抛出更具体的异常类型。
这种差异在大多数情况下都是无关紧要的,因为您总是可以捕获/throws更通用的异常类型。我认为,当您接受Supplier作为参数时,它可能会有所不同:
<X extends IOException> void example(Supplier<? extends X> exceptionSupplier)
throws IOException { // Note IOException, not X.
Optional.empty().orElseThrow(exceptionSupplier);
}您可以使用以下任一供应商作为参数来调用此函数:
Supplier<IOException> s1 = IOException::new;
Supplier<FileNotFoundIOException> s2 = FileNotFoundIOException::new;但是,如果没有Supplier<? extends X>的上限,您就不能实现后者。
https://stackoverflow.com/questions/67192004
复制相似问题