Потому что небольшие обновления в спецификации говорят так, наверное. Это имеет значение? Это не сработает.
Нет реальной цели превращать исключение в параметризованный тип здесь. Кроме того, вы сделаете из этого кода цепочку RuntimeException
. Попробуйте вместо этого:
static <T, R> Function<T, R> wrap(FunException<T, R> fn) {
return t -> {
try {
return fn.apply(t);
} catch (Error | RuntimeException ex) {
throw ex;
} catch (Throwable throwable) {
throw new RuntimeException("Checked exception in lambda", throwable);
}
};
}
interface FunException<T, R> {
R apply(T t) throws Throwable;
}
и теперь все будет хорошо.
ЧИТАТЕЛЮ: Не делай этого. Правильный способ иметь дело с правилами Java, такими как проверенные исключения, состоит в том, чтобы иметь дело с ними. Использование хаков, чтобы обойти суть языка, просто означает, что ваш код не является идиоматическим (другие, которые читают ваш код, не получат его, и вам будет трудно читать код других. Это плохо), имеет тенденцию к плохое взаимодействие с другими библиотеками, и различные функции, которые должны помочь, теперь пострадали (пример: здесь вы получаете МНОГО цепей причинных исключений, которые затрудняют чтение ваших журналов и трассировок исключений, чем это необходимо). Кроме того, «далеко от проторенного пути» это приводит к забавным временам, таким как код, который раньше компилировался, больше не компилируется.