2017-02-14 11 views
0

Я использую NamedParameterJdbcTemplate в моем проекте и передать параметры таким образом:переменной длины для отображения в Котлин

MapSqlParameterSource(mapOf(
    "userId" to userId, 
    "count" to count 
)) 

Я не хочу, чтобы написать в первой строке все время, и я хочу, чтобы создать свою собственную функцию, которая будет брать пары строк к любым значения:

params(
    "userId" to userId, 
    "count" to count 
) 

Но когда я пытаюсь реализовать его у меня есть проблемы с дженерик (я не выкладываю описание ошибки здесь):

fun params(vararg pairs: Pair<String, Any>) = MapSqlParameterSource(mapOf(pairs)) 

Не могли бы вы посоветовать правильную реализацию?

+0

Почему бы вам не опубликовать сообщение об ошибке? Это помогает людям увидеть проблему, не пытаясь попробовать ее самостоятельно ... – hage

ответ

4

mapOf имеет 3 реализации: ничего не принимает, беря 1 пар и принимая парные пары.

С pairs в вашем коде на самом деле Array<Pair<String, Any>> нет соответствующей реализации mapOf для звонка. Это связано с тем, что varargs как java реализует их в некоторых случаях неоднозначно, поэтому Kotlin требует явных аргументов.

Чтобы заставить его работать, используйте оператор «спред», чтобы указать способ vararg. (https://kotlinlang.org/docs/reference/functions.html#variable-number-of-arguments-varargs)

fun params(vararg pairs: Pair<String, Any>) = MapSqlParameterSource(mapOf(*pairs))

+0

Спасибо, я узнаю, как соответствие vararg с оператором * – awfun

+2

Остерегайтесь, что 'mapOf (* pairs)' создает копию массива 'pairs' до передавая его в 'mapOf'. Возможно, лучше использовать 'pairs.toMap()' – Ilya