Неоднозначный вызов метода с установщиком JvmSyntheti c - PullRequest
1 голос
/ 06 августа 2020

У меня есть класс с сеттерами @JvmSynthetic, чтобы обеспечить только беглые сеттеры, подобные построителю, для Java клиентов:

class PersonBuilder {
    @set:JvmSynthetic    // hide a void setter from Java
    var age: Int? = null

    @set:JvmSynthetic
    var name: String? = null

    fun setAge(age: Int?) = apply { this.age = age }

    fun setName(name: String?) = apply { this.name = name }

    fun build() = Person(age!!, name!!)
}

И назовите его так на стороне Java:

new PersonBuilder()
        .setAge(22)  // <- "error"
        .setName("Peter")
        .build();

Он компилируется и запускается, но Android Studio показывает ошибку « Неоднозначный вызов метода. Оба setAge (Integer) в PersonBuilder и setAge (Integer) в PersonBuilder соответствуют » и не предоставляет никаких автопредложений и форматирования кода после этой "ошибки".

1 Ответ

1 голос
/ 06 августа 2020

Я считаю, что нет необходимости использовать обозначение @set:JvmSynthetic, просто измените видимость переменных. Попробуйте следующее:

class PersonBuilder {
    private var age: Int? = null
    private var name: String? = null

    fun setAge(age: Int) = apply { this.age = age }

    fun setName(name: String) = apply { this.name = name }

    fun build() = Person(age!!, name!!) //be careful!
}

В любом случае, будьте осторожны с функцией сборки. Нет никаких гарантий, что перед ним будут вызваны функции setAge и setName, поэтому вы можете получить исключение NullPointerException

Update

Другой способ решить эту проблему, сохранив @JvmSynthetic, - это добавить @JvmField тоже обозначение. См. в этой статье для получения дополнительной информации.

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