以下代码在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并运行时,不会发生错误。
感谢您的任何指导或建议。
答案 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;