首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Supplier<X>和Supplier<有什么不同?扩展X>

Supplier<X>和Supplier<有什么不同?扩展X>
EN

Stack Overflow用户
提问于 2021-04-21 16:26:27
回答 1查看 63关注 0票数 2

在"Optional“源代码中,我发现了这个函数:

代码语言:javascript
复制
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get();
    }
}

我的问题是,如果我把这个函数改成这样,它看起来是一样的

代码语言:javascript
复制
public <X extends Throwable> T orElseThrow(Supplier<X> exceptionSupplier) throws X {
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get();
    }
}

有人知道原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-21 16:28:40

考虑以下方法:

代码语言:javascript
复制
void example() throws IOException {
  throw new FileNotFoundException();
}

它声明抛出一般的IOException,但具体抛出一个更具体的异常FileNotFoundException

orElseThrow相同:通过接受上限供应商,它可以抛出更具体的异常类型。

这种差异在大多数情况下都是无关紧要的,因为您总是可以捕获/throws更通用的异常类型。我认为,当您接受Supplier作为参数时,它可能会有所不同:

代码语言:javascript
复制
<X extends IOException> void example(Supplier<? extends X> exceptionSupplier)
    throws IOException {  // Note IOException, not X.
  Optional.empty().orElseThrow(exceptionSupplier);
}

您可以使用以下任一供应商作为参数来调用此函数:

代码语言:javascript
复制
Supplier<IOException> s1 = IOException::new;
Supplier<FileNotFoundIOException> s2 = FileNotFoundIOException::new;

但是,如果没有Supplier<? extends X>的上限,您就不能实现后者。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67192004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档