具有不同对类型的函数重载抛出

Function overloading with different pair types throws

所以我重载了如下函数:

fun putParams(vararg params: Pair<String, String>) {

}
fun putParams(vararg params: Pair<String, Int>) {

}

你能推荐我避免这个错误的方法吗?

与 Java 一样,Kotlin 关于泛型的类型信息仅在编译时可用。在 运行-time Pair<String, Int>Pair<String, String> 对解释器来说都是一样的。因此方法签名是重复的。

作为解决方案,我将创建两种不同的类型。

fun putParams(vararg params: StringPair) {..}
fun putParams(vararg params: StringAndIntPair) {..}

Kotlin Type Erasure

很难猜出你真正想要完成什么...这是一个解决方案,它允许通过供应商 (() -> Any) 提供参数或传递实际值 (Any ):

@JvmName("putSupplierParams")
fun putParams(vararg params: Pair<String, () -> Any>) = putParams(*params.map { (key, func) ->
    key to func()
  }.toTypedArray()) // just delegated to the following putParams-function

fun putParams(vararg params: Pair<String, Any>) {
    // magic
}

用法为:

putParams("key" to "value")
putParams("key via supplier" to { "supplied value" })

替代方案可以是:

class ParamContainer {
  infix fun <T> String.to(supplier : () -> T) = to(supplier())
  infix fun <T> String.to(value : T) {
    // magic
  }
}

(或者只是 Any 而不是 T),用法如下:

with(ParamContainer()) {
  "key" to "value"
  "solution" to 42
  "supplied" to {
    "supplied value"
  }
}