供应商< x>和供应商< x>之间有什么区别?扩展x>

vsnjm48y  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(551)

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

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();
    }
}

有人知道原因吗?

jgovgodb

jgovgodb1#

考虑以下方法:

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> .

相关问题