initialize findview extensions kotlin kotlin-android-extensions kotlin-extension

kotlin - findview - Anulación accidental: las siguientes declaraciones tienen la misma firma JVM



kotlin extensions (2)

Además de la respuesta ya dada ...

  • O bien, puede mantener val (o var ) pero cambiar el nombre del parámetro a algo que no coincida con la declaración de la super clase.

En una declaración de clase, los parámetros en las declaraciones del constructor son a menudo más que solo parámetros. Usando val o var , en realidad estás declarando miembros de propiedad (no solo parámetros). Y junto con los miembros de la propiedad vienen los "captadores" automáticos (y los "configuradores" en el caso de var ). El captador automático, en el caso del OP, se llama getContext() pero la clase base ya tiene un getContext () (la misma firma).

Lo más probable es que la intención aquí fuera simplemente pasar el context al super, en cuyo caso, la otra respuesta funciona mejor. Pero, en el caso de que se desee una nueva propiedad, pero el nombre elegido colisione con un miembro de super propósito, el cambio es la alternativa.

En resumen , el cambio de nombre se aplica cuando desea una nueva variable de miembro, pero una súper clase ya expone a un miembro diferente con el mismo nombre.

Estoy recibiendo 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) {

contexto val privado: contexto

en el registro 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é está causando el problema.


Esto sucede porque el compilador de Kotlin intenta generar un captador para el val context declarado en el constructor primario de su clase, es decir, un método getContext() , pero la clase base ArrayAdapter<T> ya tiene dicho método .

Puedes resolverlo haciendo uno de los siguientes:

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

    class GitHubRepoAdapter(context: Context, ...

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

    Esta parece ser la solución preferible en su caso, ya que, incluso sin redeclaración, ya existe un context propiedades sintéticas deducido del Java getter .

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

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

    Esto hará que el compilador genere el captador con otro nombre JVM (el que se especifica en la anotación), evitando así el conflicto, pero haciendo que el acceso desde Java sea menos intuitivo (especialmente porque habrá dos funciones similares). En Kotlin, aún podrá utilizar la propiedad con su context nombre original.