我在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!
我看不出是什么引起了这个问题。
9条答案
按热度按时间y1aodyip1#
这是因为Kotlin编译器试图为类主构造函数中声明的
val context
生成一个getter,即一个方法getContext()
,但基类ArrayAdapter<T>
已经有了这样一个方法。您可以通过执行以下操作之一来解决此问题:
val
。在这种情况下,不会生成getter,冲突也就消失了。
在您的情况下,这似乎是更好的解决方案,因为即使没有重新声明,也已经有一个从Java getter推断出的合成属性
context
。@JvmName
注解,将其应用于context
属性getter:这将使编译器用另一个JVM名称(注解中指定的名称)生成getter,从而避免冲突,但使从Java访问它变得不那么直观(特别是因为将有两个类似的函数)。在Kotlin中,您仍然可以使用其原始名称
context
的属性。xmq68pz92#
除了已经给出的答案之外...
val
(或var
),但将参数的名称更改为与超类声明不冲突的名称。在类声明中,构造函数声明中的参数通常不仅仅是参数。使用
val
或var
,您实际上是在声明属性成员(而不仅仅是参数)。与属性成员一起沿着的还有自动的“getter”(在var
的情况下还有“setter”)。在OP的情况下,自动getter被称为getContext()
,但基类已经有了getContext()(相同的签名)。最有可能的是,这里的意图只是将
context
传递给super,在这种情况下,另一个答案效果最好。但是,如果需要一个新的属性,但是所选择的名称与super的不同用途的成员冲突,则更改名称是另一种选择。简而言之,当您确实需要一个新的成员变量但一个超类已经公开了一个同名的不同成员时,更改名称适用。
huus2vyu3#
我得到了一个类似的错误,我通过从构造函数参数中删除空检查来解决它
来自
到
hivapdat4#
将变量名更改为myContext,并将与您一起工作,没有任何问题。
e37o9pze5#
我想在这里补充一点:
当你将参数命名为
context
时,它将与基类参数名冲突,默认情况下基类参数名也是context
。因此,更改参数的名称将对您有所帮助。laximzn56#
这两个函数的返回类型是
Context
和Context!
,这是两个不同的东西。要修复它,请在代码中添加感叹号。kadbb4597#
有类似的问题,什么工作是确保我的
targetSdkVersion
和compileSdkVersion
是相同的所有模块。odopli948#
根据@hotkey的回答...在这个特殊的例子中,我相信原因是因为OP做了以下事情:
在父类已经定义了public/protected方法“getContext()"的子类上。
我遇到了同样的情况,并使用了@hotkey的建议,但针对特定的用例,只需注解getter本身:
这个注解确保创建的自动getter具有与父getter不同的名称,而不会影响您的语法/上下文的使用。
希望能帮上忙!
e3bfsja29#
1.请更改你的上下文名称,因为你的参数作为上下文,它将与基类参数名称,这也是上下文默认情况下推翻。因此,更改参数的名称将对您有所帮助。