【发布时间】:2019-06-12 09:27:11
【问题描述】:
在尝试创建一个简单的数据库助手时,我想填写来自 Spring 的 RowMapper<T>,但 Kotlin 坚持使用 KFunction2,即使 RowMapper 的接口匹配。这适用于 Spring Java 代码的原始接口。
在我看来,这些方法在重要部分似乎是相同的。但是,Kotlin 不同意我的观点。
我的界面(kotlin)如下所示:
interface MyJdbcOperations : NamedParameterJdbcOperations {
fun <T> querySingle(
sql: String,
parameters: MapSqlParameterSource,
rowMapper: RowMapper<T>): Optional<T>
}
NamedParameterJdbcOperations里面的查询界面如下(Java):
public interface NamedParameterJdbcOperations {
// ... rest of interface omitted for readability
<T> List<T> query(String sql, SqlParameterSource paramSource, RowMapper<T> rowMapper)
throws DataAccessException;
}
但是当我使用我的MyJdbcOperations 实现如下:
template.query<Foo>(sql, parameters, this::mapToFoo)
template.querySingle<Foo>(sql, parameters, this::mapToFoo)
第一个版本可以,没问题,我也可以删除<Foo>,让类型推断完成它的工作。
然而,第二个版本给了我这样的错误:
Error:(25, 54) Kotlin: Type mismatch: inferred type is KFunction2<@ParameterName ResultSet, @ParameterName Int, Foo> but RowMapper<Foo> was expected
但我实际上希望这能正常工作,如果 KFunction2 签名可以满足 Java 接口中的 RowMapper<Foo>,那么我当然希望它也能够在 Kotlin 中实现。显然不是这样的。
那么我做错了什么,最好的解决方法是什么?
【问题讨论】:
标签: java spring spring-boot kotlin