为什么我的涉及泛型的 kotlin 代码无法编译?

问题描述 投票:0回答:1

任何人都可以帮我弄清楚为什么它不能编译,如果可能的话帮助我找到一种方法来实现它:

fun <KEY,VALUE> Map<KEY,List<VALUE>>.inverse(): Map<VALUE, List<KEY>> {
  val map = mutableMapOf<VALUE, List<KEY>>()
  this.forEach { (key, listOfValues) ->
    listOfValues.forEach { value ->
      map[value] = map[value]?.plus(key) ?: listOf(key)
    }
  }
  return map
}

fun <KEY,VALUE> Map<KEY,VALUE>.inverse(): Map<VALUE, List<KEY>> {
  val map = mutableMapOf<VALUE, List<KEY>>()
  this.forEach { (key, value) ->
    map[value] = map[value]?.plus(key) ?: listOf(key)
  }
  return map
}

我收到的错误消息是

Platform declaration clash: The following declarations have the same JVM signature (inverse(Ljava/util/Map;)Ljava/util/Map;):
    fun <KEY, VALUE> Map<KEY, VALUE>.inverse(): Map<VALUE, List<KEY>> defined in <package>
    fun <KEY, VALUE> Map<KEY, List<VALUE>>.inverse(): Map<VALUE, List<KEY>> defined in <package>
kotlin generics jvm
1个回答
0
投票

错误信息实际上非常清楚。两个函数接收相同的参数 (

Map
) 并返回相同的类型 (
Map
)。两个映射的类型参数并不重要,因此从 JVM 的角度来看,这些函数是相同的并且不能共存。您需要重命名其中之一以区分它们。您可以重命名 Kotlin 函数,或者,如果您想在 Kotlin 中保留相同的名称并且您的目标是 JVM,则可以仅在 JVM 中重命名它们:

@JvmName("multimapInverse")
fun <KEY,VALUE> Map<KEY,List<VALUE>>.inverse(): Map<VALUE, List<KEY>> { ... }

@JvmName("mapInverse")
fun <KEY,VALUE> Map<KEY,VALUE>.inverse(): Map<VALUE, List<KEY>> { ... }
© www.soinside.com 2019 - 2024. All rights reserved.