繁体   English   中英

供应商之间有什么区别<x>和供应商<!--? extends X--></x>

[英]what's the differences between Supplier<X> and Supplier<? extends X>

在“可选”源代码中,我发现了这个 function:

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get();
    }
}

我的问题是,如果我将 function 更改为此,它看起来像工作一样

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>的上限,你就不能做后者 Supplier<? extends X>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM