Java Interop: применить @JvmName к getters свойств в интерфейсе или абстрактном классе

Обычно мы можем написать следующий код в котлине:

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

Это приведет к генерации метода hasValue() вместо getHasValue() для Java interop .

Однако в интерфейсе это дает мне ошибку компиляции:

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

То же самое относится к следующей декларации в абстрактном классе:

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

Итак, вот мой вопрос: как я могу сказать компилятору kotlin использовать hasValue() вместо getHasValue() для getters (и сеттеров) свойств в интерфейсах kotlin?

Я думаю, что у Kotlin есть некоторые ограничения на использование @JvmName в open / override property / function. Запрет использования функции @JvmName в функции open / override позволяет избежать использования другого jvmName для интерфейса / суперкласса и подкласса.

В следующем примере я пытаюсь аннотировать переопределенное свойство getter с jvmName ( hasValueImpl ), которое отличается от интерфейса ( hasValue ) и дает ошибку компиляции:

Аннотации @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 }