Accidental override: The following declarations have the same JVM signature

KotlinKotlin Android-ExtensionsKotlin Extension

Kotlin Problem Overview


I'm getting error in Kotlin in this part:

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

private val context: Context

In the log it says:

> > Error:(14, 25) Accidental override: The following declarations have the same JVM signature >(getContext()Landroid/content/Context;): > fun <get-context>(): Context > fun getContext(): Context! >

I'm not able to see what is causing the problem.

Kotlin Solutions


Solution 1 - Kotlin

This happens because the Kotlin compiler tries to generate a getter for val context declared in your class primary constructor, namely a method getContext(), but the base class ArrayAdapter<T> already has such a method.

You can solve that by doing one of the following:

  • Change your class' constructor parameter not to be a val.

       class GitHubRepoAdapter(context: Context, ...
    

    In this case, the getter won't be generated, and the conflict will be gone.

    This seems to be the preferrable solution in your case, because, even without redeclaration, there is already a synthetic property context inferred from the Java getter.

  • Use the @JvmName annotation, apply it to the context property getter:

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

    This will make the compiler generate the getter with another JVM name (the one specified in the annotation), thus avoiding the conflict, but making accessing it from Java less intuitive (especially since there will be two similar functions). In Kotlin, you will still be able to use the property with its original name context.

Solution 2 - Kotlin

In addition to the answer already given...

  • Or, you can keep val (or var) but change the name of the parameter to something that doesn't collide with the super class declaration.

In a class declaration, the parameters in the constructor declarations are often more than just parameters. Using val or var, you are actually declaring property members (not just parameters). And along with the property members come automatic "getters" (and "setters" in the case of var). The automatic getter, in the OP's case, is called getContext() but the base class already has a getContext() (same signature).

Most likely, the intent here was to just pass the context to the super, in which case, the other answer works best. But, in the case where a new property is desired, but the name chosen collides with a differently purposed member of the super, changing the name is the alternative.

In short, changing the name applies when you do want a new member variable but a super class already exposes a different member by the same name.

Solution 3 - Kotlin

Change variable name to myContext and will work with you without any problems.

Solution 4 - Kotlin

Had similar problems, what worked was ensuring that my targetSdkVersion and compileSdkVersion were the same across all modules.

Solution 5 - Kotlin

I would like to add something here:

When you name your parameter as context it will collide with the base class parameter name which is also context by default. So changing the name of your parameter will help you.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEge KuzubasiogluView Question on Stackoverflow
Solution 1 - KotlinhotkeyView Answer on Stackoverflow
Solution 2 - KotlinLesView Answer on Stackoverflow
Solution 3 - KotlinHamdy Abd El FattahView Answer on Stackoverflow
Solution 4 - KotlinyevbeView Answer on Stackoverflow
Solution 5 - KotlinR. RohillaView Answer on Stackoverflow