Интересно, может ли кто-нибудь объяснить мне эту странность? Я использую обновление для Java 8.
Учитывая этот метод
private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
return fun.apply(opt) ;
}
Если я сначала создаю функцию Object и передаю это в метод выше, вещи компилируются.
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"));
}
Обновление: Оказывается, сообщение об ошибке было сокращено maven. Если скомпилировать непосредственно с помощью 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
Также смотрите здесь для исполняемого тестового кода.