java - Lambda 类型推断推断出 lambda 未抛出的异常类型

标签 java eclipse lambda java-8 type-inference

代码

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;
            }
        });
    }
}

被 eclipse 编译器拒绝并出现错误

Unhandled exception type TestException

在 main 的第一行,即使 lambda 表达式处理了这个异常(对吧?)。

这是编译器错误,还是我忽略了什么?

最佳答案

在 lambda 表达式和类型推断方面,最近发布的 Eclipse(以及 javac、IntelliJ 等)中存在大量错误。就在今天,我注册了460511 , 460515 , 和 460517 .例如,仅在这个问题中,就有不少关于 lambda 表达式和异常类型组合的修复:

我没有遇到你在 Eclipse 4.5.0 M5 中遇到的问题(也没有遇到 javac build 1.8.0_40-ea-b21),所以我敢打赌这是一个错误,它有已修复。

根据一般经验,如果您将 Java 8 与 Eclipse 结合使用,请务必升级到最新的 Mars (4.5.0) 里程碑。总是。它会让您省去很多麻烦。

关于java - Lambda 类型推断推断出 lambda 未抛出的异常类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636387/

相关文章:

java - ArrayList 可以为 null 并且大小 > 0 吗?

安卓问题 : Debug when phone off

java - Accessor 方法未从 mutator 方法接收汽车

java - 需要CallSite解释

java - 在 reduce 函数的参数中将 HashSet<Text> 作为 Iterable<Text> 传递 - HADOOP

java - java spring 如何使一个对象在所有包中可用

php - 用于 Eclipse PDT 的 Zend Framework 插件

c++ - 我怎么知道作为右值传递的对象是否会被 move ?

c++ - Qt C++ 将具有非空签名的信号连接到 lambda

java - 为什么要编译 Java 正则表达式?