使用@JvmName处理签名冲突
有时我们在Kotlin中有一个命名函数,而在对应的JVM字节码中,我们需要一个不同的名字。最突出的例子就是类型擦出:
fun List<String>.filterValid(): List<String>
fun List<Int>.filterValid(): List<Int>
这两个函数不能被定义定义在一起,因为它们的JVM签名是一致的:
filterValid(Ljava/util/List;)Ljava/util/List;
如果我们真的想让它们在Kotlin中有相同的名字,我们可以使用@JvmName标注它们中的一个,并且指定一个不同的名字作为参数:
fun List<String>.filterValid(): List<String>
@JvmName("filterValidInt")
fun List<Int>.filterValid(): List<Int>
从Kotlin中它们可以使用相同的名字访问filterValid,但是从Java中访问的名字就是filterValid和filterValidInt。同样的把戏还适用于当我们需要一个X属性并伴随着一个getX()函数:
val x: Int
@JvmName("getX_prop")
get() = 15
fun getX() = 10