Supplier<X> 和 Supplier< 有什么区别?延伸 X>
what's the differences between Supplier<X> and Supplier<? extends X>
在“可选”源代码中,我找到了这个函数:
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();
}
}
有人知道原因吗?
考虑这个方法:
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>
的上限,您将无法执行后者。
在“可选”源代码中,我找到了这个函数:
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();
}
}
有人知道原因吗?
考虑这个方法:
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>
的上限,您将无法执行后者。