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 }