Java 什么';供应商之间的差异<;X>;和供应商<;?扩展X>;

Java 什么';供应商之间的差异<;X>;和供应商<;?扩展X>;,java,wildcard,optional,supplier,Java,Wildcard,Optional,Supplier,在“可选”源代码中,我找到了以下函数: public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } } public T或lsetro

在“可选”源代码中,我找到了以下函数:

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get();
    }
}
public T或lsetrow(供应商考虑以下方法:

void example() throws IOException {
  throw new FileNotFoundException();
}
这声明它抛出一般的
IOException
,但具体地抛出一个更具体的异常,
FileNotFoundException

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

这种差异在大多数情况下都是无关紧要的,因为您总是可以捕捉到/
抛出的
更一般的异常类型。我认为这可能会产生影响的一种情况是,当您接受供应商
作为参数时:

<X extends IOException> void example(Supplier<? extends X> exceptionSupplier)
    throws IOException {  // Note IOException, not X.
  Optional.empty().orElseThrow(exceptionSupplier);
}

void示例(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;