84

在这部分我在 Kotlin 中遇到错误:

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

private val context: Context

在日志中它说:

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

我无法看到导致问题的原因。

4

5 回答 5

109

发生这种情况是因为 Kotlin 编译器尝试生成一个 getter forval context在您的类主构造函数中声明,即方法getContext(),但基类ArrayAdapter<T>已经有这样的方法

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

  • 将您的类的构造函数参数更改为不为val.

       class GitHubRepoAdapter(context: Context, ...
    

    在这种情况下,不会生成getter,冲突也就消失了。

    在您的情况下,这似乎是首选的解决方案,因为即使没有重新声明,也已经有一个context从 Java getter 推断出的合成属性。

  • 使用@JvmName注释,将其应用于context属性 getter

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

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

于 2017-05-17T22:01:04.610 回答
38

除了已经给出的答案...

  • 或者,您可以保留val(或var)但将参数名称更改为不与超类声明冲突的名称。

在类声明中,构造函数声明中的参数通常不仅仅是参数。使用valor var,您实际上是在声明属性成员(不仅仅是参数)。伴随着属性成员而来的是自动的“getter”(以及在 的情况下的“setter” var)。在 OP 的情况下,自动获取器被调用,getContext() 基类已经有一个 getContext() (相同的签名)。

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

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

于 2017-07-27T12:37:29.410 回答
3

将变量名称更改为 myContext 并且可以毫无问题地与您一起使用。

于 2020-08-28T17:02:04.287 回答
0

有类似的问题,有效的是确保我的targetSdkVersioncompileSdkVersion在所有模块中都是相同的。

于 2021-08-10T04:35:05.080 回答
0

我想在这里添加一些东西:

当您命名参数时,context它将与context默认情况下的基类参数名称发生冲突。因此,更改参数的名称将对您有所帮助。

于 2022-02-07T07:24:35.697 回答