You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin泛型扩展函数编译报错:平台声明冲突问题求助

Kotlin扩展函数编译错误:JVM签名冲突排查与解决

错误原因

Kotlin运行在JVM上时会发生类型擦除,泛型信息在编译后会被移除。你的两个inverse扩展函数,虽然在Kotlin层面泛型约束不同(一个是Map<KEY, List<VALUE>>,另一个是Map<KEY, VALUE>),但编译到JVM后,它们的方法签名完全一致:inverse(Ljava/util/Map;)Ljava/util/Map;,导致JVM无法区分这两个方法,从而抛出声明冲突错误。

解决方法

有两种常见的解决方式:

方法1:使用@JvmName注解指定不同的JVM方法名

给其中一个扩展函数添加@JvmName注解,强制让它在JVM上拥有不同的方法名,避免冲突。示例代码如下:

import kotlin.jvm.JvmName

@JvmName("inverseForListValues")
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
}

方法2:直接重命名其中一个函数

如果不需要保持函数名一致,直接给其中一个函数起不同的名字,比如把处理Map<KEY, List<VALUE>>的函数命名为inverseFlatten:

fun <KEY,VALUE> Map<KEY,List<VALUE>>.inverseFlatten(): 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
}

内容的提问来源于stack exchange,提问作者Jeremy Shapiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 12:21:07