【问题标题】:Function overloading with different pair types throws具有不同对类型的函数重载抛出
【发布时间】:2019-10-22 10:58:08
【问题描述】:

所以我重载了如下函数:

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

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

}

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

【问题讨论】:

  • 有几种可能的解决方案......那个函数的内容是什么?您可以使用泛型类型,例如fun &lt;T&gt; putParams(vararg params : Pair&lt;String, T&gt;) 或使用 @JvmName-annotations... 例如@JvmName("putStringParams") fun putParams(vararg params : Pair&lt;String, String&gt;)... 也可能只是 fun putParams(vararg params: Pair&lt;String, Any&gt;) 已经符合目的...
  • Ofc 可能有一个 Pair 类型是 Pair String> 你知道我该如何检查实例吗?
  • 我认为您计划在该函数中执行的操作更有趣...现在对我来说这听起来像是一个 xy 问题...

标签: generics kotlin jvm overloading


【解决方案1】:

很难猜出你真正想要完成什么......这是一个解决方案,它允许通过供应商 (() -&gt; 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
  }
}

(或代替T 只是Any)具有以下用法:

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

【讨论】:

  • 如果 Any 是 () -> String/Int 的实例,是否有任何方法可以检查 when 子句?
  • 仍然...我想这不是您真正想要的,但是:value is Function&lt;*&gt;...我宁愿看清楚地划分这些变体...一定是有原因的您决定立即准备一些值,然后再准备一些值……那么这样做的目的是什么?
  • 请注意,您不需要将() -&gt; T-function 委托给另一个...这只是一个示例...您可能更愿意立即处理该功能,如果这会产生更多感觉你...
【解决方案2】:

与 Java 一样,Kotlin 中关于泛型的类型信息仅在编译时可用。在运行时 Pair&lt;String, Int&gt;Pair&lt;String, String&gt; 在解释器看来都是一样的。因此方法签名是重复的。

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

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

Kotlin Type Erasure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多