Java 互操作:将@JvmName应用于接口或抽象类中的属性获取器

2022-09-01 20:52:03

通常,我们可以在 kotlin 中编写以下代码:

val hasValue : Boolean
    @JvmName("hasValue") get() = true

这将生成方法,而不是用于 Java 互操作hasValue()getHasValue()

但是,在接口中,这给了我一个编译错误:

val hasValue : Boolean
   @JvmName("hasValue") get

抽象类中的以下声明也是如此:

abstract val hasValue : Boolean
    @JvmName("hasValue") get

所以这是我的问题:我如何告诉kotlin编译器使用kotlin接口中的属性而不是getters(和setters)?hasValue()getHasValue()


答案 1

有一种解决方法,请参阅:https://youtrack.jetbrains.com/issue/KT-31420

只需通过注释来抑制此错误:INAPPLICABLE_JVM_NAME@Suppress("INAPPLICABLE_JVM_NAME")


答案 2

我认为 Kotlin 在使用 / property/function 方面有一些限制。禁止使用 on / 函数可以避免在接口/超类和子类上具有不同的 jvmName。@JvmNameopenoverride@JvmNameopenoverride

在下面的示例中,我尝试使用与接口()不同的jvmName()注释覆盖的属性getter,并且它给出了编译错误:hasValueImplhasValue

“@JvmName”注释不适用于本声明

interface Abstract {

    @get:JvmName("hasValue")        //Compile error
    val hasValue: Boolean
        get() = false
}

open class Impl : Abstract {

    @get:JvmName("hasValueImpl")    //Compile error
    final override val hasValue: Boolean
        get() = false

    @get:JvmName("hasValue2")       //Compile error if hasValue2 is open
    val hasValue2: Boolean
        get() = false
}