Java Eclipse Lambda函数错误

时间:2016-05-01 22:24:12

标签: java eclipse lambda

以下代码在Eclipse Luna中为我生成错误并阻止其运行。

    jdbcTemplate.query( query, r -> {
        Folder folder = new Folder();
        folder.setId(r.getLong("id"));
        folder.setFolderName(r.getString("folder_name"));
        folder.setFullPath(r.getString("full_path"));
        folders.add(folder);
    }, folderId);

    return folders;
}

错误发生在jdbcTemplate.query

The method query(String, ResultSetExtractor<Object>, Object[]) is ambiguous for the type JdbcTemplate

当我将文件打包为jar并运行时,不会发生错误。

感谢您的任何指导或建议。

2 个答案:

答案 0 :(得分:2)

根据the javadoc for ResultSetExtractor,您使用lambda表达式实现的方法是SharedPreferences sp = getSharedPreferences(SHARED_PREF, getApplicationContext().MODE_PRIVATE); Editor editor = sp.edit(); editor.putString(SP_NAME, etName.getText().toString()); editor.commit(); 。 extractData返回一个Object,因此你的lambda也必须返回一个Object才能正确实现它。

答案 1 :(得分:2)

JdbcTemplate中有三种查询方法,如下所示:

query(String, ResultSetExtractor<T>);
query(String, RowCallbackHandler);
query(String, RowMapper<T>);

在所有三个中,第二个参数可以实现为lambda,而具有通用<T>参数的两个参数将返回一些内容。 Eclipse抱怨说它不能区分你所指的第一个和第三个方法之间的区别,因此你需要指定lambda正在替换的功能接口的类型。另外,正如Jack Ammo所说,你需要从lambda返回一个对象以满足接口。不要将返回的对象添加到lambda内的文件夹列表中。所以,你正在看这样的事情:

Folder folder = jdbcTemplate.query( query, (ResultSetExtractor<Folder>) r -> {
    Folder folder = new Folder();
    folder.setId(r.getLong("id"));
    folder.setFolderName(r.getString("folder_name"));
    folder.setFullPath(r.getString("full_path"));
    return folder;
}, folderId);

folders.add(folder);

return folders;