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

时间:2016-02-23 14:13:13

标签: generics extension-methods kotlin

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

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。

1 个答案:

答案 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()