Случайное переопределение: следующие объявления имеют одну и ту же подпись JVM

Я получаю эту ошибку в Kotlin в этой части:

class GitHubRepoAdapter(private val context: Context, private val values: List<GithubRepo>) : ArrayAdapter<GithubRepo>(context, R.layout.list_item, values) { 

частный контекст val: контекст

в журнале говорится:

Ошибка: (14, 25) Случайное переопределение: следующие объявления имеют одну и ту же подпись JVM (getContext () Landroid / content / Context;): fun (): Context fun getContext (): Context!

Я не могу понять, что вызывает проблему.

Это происходит потому, что компилятор Kotlin пытается сгенерировать getter для val context объявленного в вашем основном конструкторе класса, а именно функцию getContext() , но базовый класс ArrayAdapter<T> уже имеет такую ​​функцию .

Вы можете решить это, выполнив одно из следующих действий:

  • Измените параметр конструктора класса не как val .

      class GitHubRepoAdapter(context: Context, ... 

    В этом случае геттер не будет сгенерирован, и конфликт исчезнет.

    Это, по-видимому, предпочтительное решение в вашем случае, потому что даже без переоценки уже существует синтетический context свойства, который выведен из Java-получателя .

  • Используйте аннотацию @JvmName , примените ее к @JvmName свойства context :

      class GitHubRepoAdapter(@get:JvmName("getContext_") private val context: Context, ... 

    Это заставит компилятор генерировать геттер с другим именем JVM (тем, который указан в аннотации), тем самым избегая конфликта, но делая его доступным из Java менее интуитивным (тем более, что будут две аналогичные функции). В Котлине вы все равно сможете использовать свойство с его исходным context имени.

В дополнение к уже полученному ответу …

  • Или вы можете сохранить val (или var ), но изменить имя параметра на то, что не сталкивается с объявлением суперкласса.

В объявлении класса параметры в объявлениях конструктора часто больше, чем просто параметры. Используя val или var , вы фактически объявляете элементы свойств (а не только параметры). И вместе с членами собственности появляются автоматические «геттеры» (и «сеттеры» в случае var ). Автоматический getter, в случае OP, называется getContext() но базовый класс уже имеет getContext () (та же подпись).

Скорее всего, целью здесь было просто передать context супер, и в этом случае другой ответ работает лучше всего. Но в случае, когда требуется новое свойство, но выбранное имя сталкивается с другим назначенным членом супер, изменение имени является альтернативой.

Короче говоря , изменение имени применяется, когда вам нужна новая переменная-член, но суперкласс уже предоставляет другой член с тем же именем.

Intereting Posts
Что значит ! означает значение возврата Котлина? Несогласованность получения данных из базы данных Firebase с тем же классом данных Как вызвать метод Java Kotlin, который называется с escape-символами? Почему функция Kotlin с параметрами по умолчанию создает метод с неиспользуемым параметром Неизвестная функция (Facet ), покрытая несвязанными плагинами Kotlin: как создать 2D-массив типа String Широковещательный приемник onReceive () не вызывается Android: Kotlin с Butterknife Kotlin Либо монада: рефакторинг вызова конструктора для обработки CPS Почему универсальные типы алгебраических данных требуют `T` для типов членов? Android RxJava onNext вызывается, даже если наблюдатель не подписан Сборник JAR для Scala & Kotlin Лучший способ использования BufferedReader в Котлине Как мне передать класс / класс класса Kotlin из String? Общие понятия Котлина: несоответствие типов в параметре общей карты