Accidental override: The following declarations have the same JVM signature

Ege Kuzubasioglu picture Ege Kuzubasioglu · May 17, 2017 · Viewed 30.6k times · Source

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.

Answer

hotkey picture hotkey · May 18, 2017

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("getContext_") 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.