使用@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

results matching ""

    No results matching ""