我不知道是否有人能够向我解释下面的古怪。我使用Java 8日更新11Java8兰巴达斯和例外
鉴于这种方法
private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
return fun.apply(opt) ;
}
如果我先构造一个函数对象,并传递到上面的方法,事情编译。
private void doesCompile() {
Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
runFun(fun, Optional.of("foo"));
}
但是,如果我内联函数的拉姆达,编译器说
没有报告异常X;必须捕获或声明抛出
private void doesNotCompile() {
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}
更新: 原来的错误信息被行家缩写。如果直接用javac编译,错误的是:
error: unreported exception X; must be caught or declared to be thrown
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
^
where X,T are type-variables:
X extends Throwable declared in method <X>orElseThrow(Supplier<? extends X>)
T extends Object declared in class Optional
另见here可运行测试代码。
听起来像另一种类型的推理错误。请确保在Eclipse使用自己的编译器时包含详细信息*,您会收到此错误。 – 2014-08-27 09:27:28
注意到如果您使用匿名类也会发生同样的事情,所以它不是lambda问题。 – user2504380 2014-08-27 10:38:09
另一方面:Eclipse编译这个就好了,使用'o。 orElseThrow(()...'解决了这个问题,但是,这不应该是必须的(我认为在另一个stackoverflow问题中报告了类似的问题前段时间,但我现在没有找到它......) –
Marco13
2014-08-27 11:42:17