web-dev-qa-db-fra.com

Remplacement accidentel: les déclarations suivantes ont la même signature JVM

Je reçois cette erreur à Kotlin dans cette partie:

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

contexte de val privé: contexte

dans le journal, il est écrit:

Erreur: (14, 25) Remplacement accidentel: les déclarations suivantes ont la même signature JVM (getContext () Landroid/content/Context;): fun (): Contexte fun getContext (): Context!

Je ne suis pas capable de voir ce qui cause le problème.

39
Ege Kuzubasioglu

Cela est dû au fait que le compilateur Kotlin essaie de générer un getter pour val context Déclaré dans le constructeur principal de votre classe, à savoir une méthode getContext(), mais la classe de base ArrayAdapter<T> a déjà une telle méthode .

Vous pouvez résoudre ce problème en effectuant l’une des opérations suivantes:

  • Modifiez le paramètre constructeur de votre classe pour qu'il ne soit pas un val.

     class GitHubRepoAdapter(context: Context, ...
    

    Dans ce cas, le getter ne sera pas généré et le conflit aura disparu.

    Cela semble être la solution préférable dans votre cas, car, même sans redéclaration, il existe déjà une propriété synthétique context déduite de Java getter .

  • Utilisez l'annotation @JvmName , appliquez-la à l'objet getter context. :

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

    Cela permettra au compilateur de générer le getter avec un autre nom JVM (celui spécifié dans l’annotation), évitant ainsi le conflit, mais rendant l’accès depuis Java moins intuitif (d’autant plus qu’il y aura deux fonctions similaires). Dans Kotlin, vous pourrez toujours utiliser la propriété avec son nom original context.

56
hotkey

En plus de la réponse déjà donnée ...

  • Ou bien, vous pouvez conserver val (ou var), mais remplacez le nom du paramètre par quelque chose qui n'entre pas en conflit avec la déclaration de super classe.

Dans une déclaration de classe, les paramètres des déclarations du constructeur sont souvent plus que des paramètres. En utilisant val ou var, vous déclarez réellement des membres de propriété (pas seulement des paramètres). Et avec les membres de la propriété viennent des "getters" automatiques (et des "setters" dans le cas de var). Le getter automatique, dans le cas du PO, s'appelle getContext()mais la classe de base a déjà un getContext () (même signature).

Probablement, l’intention ici était simplement de passer le context au super, auquel cas l’autre réponse fonctionne mieux. Mais, dans le cas où une nouvelle propriété est souhaitée, mais que le nom choisi entre en collision avec un membre du super différent, le changement de nom est l'alternative.

En bref, le changement de nom s'applique lorsque vous faites voulez une nouvelle variable de membre mais une super classe expose déjà un membre différent du même nom.

20
Les