Lambda重载方法

时间:2015-10-21 13:01:53

标签: java lambda interface functional-programming java-8

我是lambdas和funtional接口的新手。我试图用lambda实现RowListener功能接口(ActiveJDBC ORM),但是我遇到了编译错误,我现在不知道为什么。

这里是匿名类旧式的样子:

db.find("some query", new RowListener() {
        @Override
        public boolean next(Map<String, Object> arg0) {
            // TODO Auto-generated method stub
            return false;
        }
    });

这是我想做的事情:

db.find("some query", map -> {
        // whatever
    });

给我的错误是:

  

Base类型中的方法find(String,Object ...)不适用于参数(String,(map) - &gt; {})

我认为它试图将lambda应用于一种重载的方法来查找&#39;我没有将RowListener作为参数,但我不确定为什么。

你能解决的任何问题都会有所帮助。

2 个答案:

答案 0 :(得分:2)

形式

的lambda表达式
map -> {
        // whatever
    }

与功能签名不兼容。根据您的内部类示例代码,它必须返回boolean值。因此,它必须是

map -> {
        // whatever
        return false;
    }

map -> /* simple expression, e.g.: */ false

在重载方法的情况下,编译器使用lambda表达式的形状,即它是值兼容还是 void compatible (参见JLS §15.27.2),确定哪些方法适用。

请记住,如果lambda的主体是包含条件代码的块,则所有可以正常完成的代码流必须返回一个值。

由于所有方法都不适用,因此编译器根据一个算法选择一个报告错误,该算法独立于一个参数是lambda表达式的事实。它似乎报告了方法find(String, Object...),因为该方法可以使用大多数类型的参数。你可以说,如果没有lambda表达式,该方法可以消耗任何东西。

这可能是在lambda表达式要考虑之前实现的编译器特定行为。但是,这只是错误报告行为,主要问题是lambda表达式不是值兼容。修复它应解决所有问题。

答案 1 :(得分:0)

啊,这个错误信息使我感到困惑。我添加了一个布尔返回值,它编译:)