"та же сигнатура JVM", реализующая интерфейс kotlin, содержащий метод getter - PullRequest
1 голос
/ 01 апреля 2019
interface MyInterface {
    fun getTheString(): String
}
class MyClass(var theString: String) : MyInterface {
    ...
}

обычно, когда у меня есть переменная в конструкторе для класса, он создает метод получения и установки для этой переменной.В MyClass методы getTheString() и setTheString(String) существуют, когда не реализуются MyInterface.

Когда MyClass реализует MyInterface, я получаю ошибку:

Случайное переопределение: Следующие объявления имеют одинаковую подпись JVM (getTheString () Ljava / lang / String;):

  • public final fun (): строка определена в MyClass
  • public abstract fun getTheString (): Строка, определенная в MyClass

У меня также есть ошибка: класс 'MyClass' не является абстрактным и не реализует абстрактный член public abstract fun getTheString (): Строка, определенная в MyInterface.

Поэтому у меня есть несколько вопросов:

  1. Почему 2 метода получения генерируются с одной и той же сигнатурой JVM, когдареализация интерфейса вместо одного метода получения, генерируемого без реализации интерфейса?
  2. Почему жалуется, что я не реализовал метод getTheString(), когда этот метод автоматически генерируется kotlin?
  3. Какможно получить геттер, сгенерированный переменной, чтобы он стал реализацией метода в интерфейсе?

1 Ответ

1 голос
/ 02 апреля 2019

Если интерфейс действительно в Kotlin, и вы можете изменить его, он должен быть

interface MyInterface {
    val theString: String
}

на первом месте. Java по-прежнему будет видеть getTheString(), но лучше реализовать и использовать в Kotlin.

В противном случае хорошим вариантом будет

class MyClass(@set:JvmName("setTheString") var _theString: String) : MyInterface {
    override fun getTheString() = _theString
}

К сожалению, у него все еще есть дублирующий геттер, и вы не можете сделать его только приватным. Или

class MyClass(private var _theString: String) : MyInterface {
    override fun getTheString() = _theString
    fun setTheString(value: String) { 
        _theString = value
    }
}

Обратите внимание, что если интерфейс в Java, getTheString() будет виден Kotlin как свойство.

См. Проблемы https://youtrack.jetbrains.com/issue/KT-6653 и https://youtrack.jetbrains.com/issue/KT-19444 в системе отслеживания ошибок Kotlin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...