我正在为同一个类编写两个扩展函数:
class Something<T:Any> { ... }
他们看起来像:
fun Something<Int>.toJson(): String = ...
fun Something<Double>.toJson(): String = ...
导致编译错误:
Kotlin:平台声明冲突:以下声明具有相同的JVM签名
如何创建两个扩展函数,只有泛型签名不同?还是不可能?
注意: 此问题是由作者(Self-Answered Questions)故意编写和回答的,因此常见问题Kotlin主题的答案存在于SO中。它起源于Kotlin slack #general channel。
答案 0 :(得分:21)
Kotlin专门针对此类用例@JvmName
annotation。在Kotlin,没有问题,因为它知道方法之间的区别。但Java兼容的字节代码在命名时会产生冲突,因为泛型擦除的签名是相同的。
因此,您需要使用此批注从Java和JVM的角度来控制名称。您的Kotlin代码将不会看到此替代名称,并将按预期使用该名称。
将您的代码更改为:
@JvmName("somethingIntToJson") fun Something<Int>.toJson(): String = ...
@JvmName("somethingDoubleToJson") fun Something<Double>.toJson(): String = ...
从Kotlin,正常使用:
val someIntyThing = Something<Int>(194)
val json = someIntyThing.toJson()