任何人都可以帮我弄清楚为什么它不能编译,如果可能的话帮助我找到一种方法来实现它:
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>
错误信息实际上非常清楚。两个函数接收相同的参数 (
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>> { ... }