我是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作为参数,但我不确定为什么。
你能解决的任何问题都会有所帮助。
答案 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)