Anulación accidental: las siguientes declaraciones tienen la misma firma de JVM

Estoy obteniendo este error en Kotlin en esta parte:

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

context val privado: context

en el log dice:

Error: (14, 25) Anulación accidental: las siguientes declaraciones tienen la misma firma JVM (getContext () Landroid / content / Context;): fun (): Context fun getContext (): Context!

No puedo ver qué causa el problema.

Esto sucede porque el comstackdor de Kotlin intenta generar un getter para el val context declarado en el constructor primario de su class, concretamente una function getContext() , pero la class base ArrayAdapter<T> ya tiene dicha function .

Puede resolver eso haciendo uno de los siguientes:

  • Cambie el parámetro constructor de su class para que no sea un val .

      class GitHubRepoAdapter(context: Context, ... 

    En este caso, el getter no se generará, y el conflicto desaparecerá.

    Esta parece ser la solución preferible en su caso, ya que, incluso sin networkingeclaración, ya existe un context propiedad sintético inferido del captador de Java .

  • Use la anotación @JvmName , aplíquela al getter de propiedad de context :

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

    Esto hará que el comstackdor genere el getter con otro nombre de JVM (el especificado en la anotación), evitando así el conflicto, pero haciendo que el acceso desde Java sea less intuitivo (especialmente porque habrá dos funciones similares). En Kotlin, aún podrá usar la propiedad con su context nombre original.

Además de la respuesta ya dada …

  • O bien, puede mantener val (o var ) pero cambie el nombre del parámetro a algo que no colisione con la statement de superclass.

En una statement de class, los parameters en las declaraciones del constructor a menudo son más que simples parameters. Usando val o var , en realidad está declarando miembros de propiedad (no solo parameters). Y junto con los miembros de la propiedad vienen "getters" automáticos (y "setters" en el caso de var ). El getter automático, en el caso del OP, se llama getContext() pero la class base ya tiene un getContext () (misma firma).

Lo más probable es que la intención aquí fuera pasar el context al súper, en cuyo caso, la otra respuesta funciona mejor. Pero, en el caso de que se desee una nueva propiedad, pero el nombre elegido choca con un miembro del súper súper propuesto, cambiar el nombre es la alternativa.

En resumen , cambiar el nombre se aplica cuando desea una nueva variable miembro, pero una superclass ya expone a un miembro diferente con el mismo nombre.

  • El tipo Out-Projected 'ArrayList <*>' prohíbe el uso de 'public fun fun add (índice: Int, elemento: E): Unidad definida en java.util.ArrayList'
  • La biblioteca de Android no puede comstackr kotlin
  • Obligatorio <Objeto> y encontrado <Objeto>?
  • Clase Kotlin no encontrada
  • Extensión sintética Kotlin para ver
  • Hacer clic en una vista de text para cambiar el fragment
  • Kotlin || ¿No puedo agregar la biblioteca a Mi aplicación?
  • No se puede acceder a EditText u otros componentes de la interfaz de usuario con Kotlin
  • Por qué los numbers que aceptan nulos no son para preservar la identidad
  • Android Studio 3 no puede build fragments de kotlin