Java Interop:将@JvmName应用于接口或抽象类中的属性的获取者

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

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

这将为Java interop生成方法hasValue()而不是getHasValue()

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

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

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

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

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

我认为Kotlin在open / override属性/函数上使用@JvmName有一些限制。 禁止在open / override函数上使用@JvmName可以避免在接口/超类和子类上具有不同的jvmName。

在下面的例子中,我想用一个与接口( hasValue )不同的jvmName( hasValueImpl )来注解被覆盖的属性getter,并给出编译错误:

“@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 }