Интерфейсная функция сталкивается с Property getter

Имя функции интерфейса конфликтует с именем получателя свойства намеренно, но оно запрещено компилятором из-за случайной проблемы с переопределением. Возможно ли проинструктировать компилятор?

interface A {
  fun getFoo()
}

class B: A {
  val foo
}

Ответы

Ответ 1

Эта функция, похоже, не реализована никоим образом.

@AndreyBreslav прокомментировал аналогичный вопрос:

Вы не можете переопределить Java-методы с помощью свойств Kotlin на данный момент. Было бы неплохо, если бы мы могли его поддержать, но мы не знаем, как это сделать для смешанных иерархий


Это не решает вашу проблему, но, по крайней мере, делает компиляцию кода: вы можете изменить JVM-имя получателя с @JvmName аннотации @JvmName:

interface A {
    fun getFoo(): SomeType
}

class B: A {
    override fun getFoo() = foo

    val foo: SomeType = someValue()
        @JvmName("getFoo_") get() = field
}

Также рассмотрите переход к более идиоматическому подходу: определите val -property в своем интерфейсе, чтобы вы могли переопределить его в реализациях:

interface A {
    val foo: SomeType
}

class B : A {
    override val foo: SomeType = someValue()
}

class C : A {
    override val foo: SomeType
        get() = someCustomGetter()
}