我有两个Kotlin扩展方法为同一类,但具有不同的通用签名和编译器抱怨

我正在为同一个类写两个扩展函数:

class Something<T:Any> { ... } 

他们看着像是:

 fun Something<Int>.toJson(): String = ... fun Something<Double>.toJson(): String = ... 

并导致编译器错误:

Kotlin:平台声明冲突:以下声明具有相同的JVM签名

如何创建两个只有泛型签名不同的扩展函数? 或者是不可能的?

注意: 这个问题是由作者故意编写和回答的( 自我回答问题 ),所以对于常见的Kotlin主题的答案是在SO中。 它起源于Kotlin松懈的 #通道。

Kotlin专门为这种类型的用例提供了@JvmName注解 。 在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()