Kotlin 意外重写:以下声明具有相同的JVM签名

Kotlin 意外重写:以下声明具有相同的JVM签名,kotlin,kotlin-android-extensions,kotlin-extension,Kotlin,Kotlin Android Extensions,Kotlin Extension,我发现Kotlin在这一部分有错误: class GitHubRepoAdapter( private val context: Context, private val values: List<GithubRepo> ) : ArrayAdapter<GithubRepo>( context, R.layout.list_item, values ) 我看不出是什么导致了问题。发生这种情况是因为Kotlin编译器试图为类主构

我发现Kotlin在这一部分有错误:

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

我看不出是什么导致了问题。

发生这种情况是因为Kotlin编译器试图为类主构造函数中声明的
val context
生成一个getter,即方法
getContext()
,而不是基类

您可以通过执行以下操作之一来解决此问题:

  • 将类的构造函数参数更改为非
    val

       class GitHubRepoAdapter(context: Context, ...
    
    在这种情况下,将不会生成getter,冲突也将消失

    在您的情况下,这似乎是首选的解决方案,因为即使没有重新声明

  • 使用注释:

    这将使编译器使用另一个JVM名称(注释中指定的名称)生成getter,从而避免冲突,但会降低从Java访问它的直观性(特别是因为将有两个类似的函数)。在Kotlin中,您仍然可以使用该属性的原始名称
    context


    • 除了已经给出的答案之外

      • 或者,您可以保留
        val
        (或
        var
        ),但将参数的名称更改为与超类声明不冲突的名称
      在类声明中,构造函数声明中的参数通常不仅仅是参数。使用
      val
      var
      ,实际上是在声明属性成员(而不仅仅是参数)。与属性成员一起出现的是自动的“getter”(在
      var
      的情况下是“setter”)。在OP的例子中,自动getter被称为
      getContext()
      ,但是基类已经有了一个getContext()(相同的签名)

      最有可能的是,这里的意图只是将
      上下文传递给super,在这种情况下,另一个答案效果最好。但是,如果需要一个新属性,但所选名称与super的另一个目的不同的成员冲突,则可以更改名称


      简言之,当您确实想要一个新成员变量一个超类已经公开了一个同名的不同成员时,更改名称将适用。

      将变量名称更改为myContext,并将与您一起工作而不会出现任何问题。

      我认为这个版本实际上比公认的答案更可取。如果我的超类已经有了一个变量的属性/getter/setter,为什么还要创建第二个呢?删除
      val/var
      似乎是最巧妙的方法。@withoutclass-你误解了我的答案,我的回答是,你可以保留val或var,只需更改变量的名称,这在超级类已经使用你选择的名字时很有用。如果超类为属性使用的名称与您为变量计划的用途完全不同,那么使用不同名称的新属性是合适的。我将更新我的答案以使其更清楚。这是否适用于从接口继承的val属性?我的意思是,例如与
      val context:context
      的接口,这可能会有帮助
         class GitHubRepoAdapter(context: Context, ...
      
         class GitHubRepoAdapter(@get:JvmName("getAdapterContext") private val context: Context, ...