使用Optional#orElseThrow正确使用lambda表达式

问题描述 投票:0回答:1

考虑以下简单示例:

Optional.empty().orElseThrow(this::exceptionSupplier);

IntelliJ为供应商生成如下方法,但难以编译!

private <X extends Throwable> X exceptionSupplier() {
    return new RuntimeException();
}

不兼容的类型。必需:X Found:java.lang.RuntimeException

如果我将签名更改为以下内容,则可以正常工作。

private Exception exceptionSupplier() {
    return new RuntimeException();
}

编译器无法确定X的正确类型是否正确?

java functional-interface
1个回答
2
投票

如果第一个示例有效,请考虑以下事项:

Supplier<InterruptedException> s = this::exceptionSupplier;

如果你像这样调用它,那么这将失败一个ClassCastException

InterruptedException e = s.get();

这是因为X是在呼叫站点确定的。编译器插入了一个隐式强制转换:

InterruptedException e = (InterruptedException) s.get();

但是,当然,s会给你一个RuntimeException,它不能被投射到InterruptedException

如果要返回RuntimeException,请使用方法RuntimeException的返回类型,不需要类型变量。

© www.soinside.com 2019 - 2024. All rights reserved.