КодексаLambda умозаключения типа выводит исключение типа не брошенная лямбда
class TestException extends Exception {
}
interface Task<E extends Exception> {
void call() throws E;
}
public class TaskPerformer {
/** performs a task in the proper context, rethrowing any exceptions the task declares */
private <E extends Exception> void perform(Task<E> task) throws E {
beforeTask();
try {
task.call();
} finally {
afterTask();
}
}
private void afterTask() {
// implementation elided (does not matter)
}
private void beforeTask() {
// implementation elided (does not matter)
}
public static void main(String[] args) {
new TaskPerformer().perform(() -> { // compilation error
try {
throw new TestException();
} catch (TestException e) {
return;
}
});
}
}
отвергается затмение компилятора с ошибкой
Unhandled типа исключения TestException
в первая строка main, хотя выражение лямбда обрабатывает это исключение (правильно?).
Является ли это ошибкой компилятора, или я что-то пропускаю?
Кажется, это ошибка в 'Eclipse'. Jdk скомпилирует ваш код без проблем. – Holger
@ Хольджер, тот же результат здесь с Oracle JDK 1.8.0_31. meriton, вы проверили открытые ошибки в Eclipse? – ThanksForAllTheFish
Я думал, что значение 'E' в' perform' будет 'Exception', но оно выводится в' RuntimeException', когда исключенное исключение не выбрасывается из лямбда. Не видел, чтобы ошибка говорила «TestException». –