varargs在Kotlin地图

awf*_*fun 2 java generics dictionary kotlin

我在项目中使用NamedParameterJdbcTemplate并以这种方式传递参数:

MapSqlParameterSource(mapOf(
    "userId" to userId,
    "count" to count
))
Run Code Online (Sandbox Code Playgroud)

我不想一直写第一行,我想创建自己的函数,它将采用成对的字符串到任意值:

params(
    "userId" to userId,
    "count" to count
)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试实现它时,我遇到了泛型问题(我不在这里发布错误描述):

fun params(vararg pairs: Pair<String, Any>) = MapSqlParameterSource(mapOf(pairs))
Run Code Online (Sandbox Code Playgroud)

你能否就正确实施提出建议?

Kis*_*kae 7

mapOf 有3个实现:什么都不做,拿1对,并采取一对vararg.

因为pairs在你的代码中实际上Array<Pair<String, Any>>没有匹配的实现mapOf来调用.这是因为在某些情况下,java实现它们的varargs是不明确的,因此Kotlin需要显式参数.

为了使其工作,使用"spread"运算符来指示应该使用vararg方法.(https://kotlinlang.org/docs/reference/functions.html#variable-number-of-arguments-varargs)

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

  • 请注意,`mapOf(*pairs)`在将它们传递给`mapOf`之前创建`pairs`数组的副本.使用`pairs.toMap()`可能更好 (3认同)