При попытке создать простой помощник по базе данных у меня есть RowMapper<T>
от Spring, который я хочу заполнить, но Котлин настаивает на использовании KFunction2
, хотя интерфейс RowMapper
совпадает. Это работает на необработанном интерфейсе из Java-кода Spring.
Мне кажется, методы имеют идентичные значения в важных частях. Однако Котлин не согласен со мной.
Мой интерфейс (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
может удовлетворить RowMapper<Foo>
в интерфейсе Java, то я, скорее всего, ожидаю, что это будет возможно и в Kotlin. Это явно не тот случай.
Так что же я делаю не так, и как лучше всего это исправить?