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
相关产品推荐
相关产品推荐

