kotlin 意外超控:以下声明具有相同的JVM签名

dgenwo3n  于 2023-10-23  发布在  Kotlin
关注(0)|答案(9)|浏览(213)

我在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!

我看不出是什么引起了这个问题。

y1aodyip

y1aodyip1#

这是因为Kotlin编译器试图为类主构造函数中声明的val context生成一个getter,即一个方法getContext(),但基类ArrayAdapter<T>已经有了这样一个方法。
您可以通过执行以下操作之一来解决此问题:

  • 将类的构造函数参数更改为非val
class GitHubRepoAdapter(context: Context, ...

在这种情况下,不会生成getter,冲突也就消失了。
在您的情况下,这似乎是更好的解决方案,因为即使没有重新声明,也已经有一个从Java getter推断出的合成属性context

  • 使用@JvmName注解,将其应用于context属性getter:
class GitHubRepoAdapter(@get:JvmName("getAdapterContext") private val context: Context, ...

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

xmq68pz9

xmq68pz92#

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

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

在类声明中,构造函数声明中的参数通常不仅仅是参数。使用valvar,您实际上是在声明属性成员(而不仅仅是参数)。与属性成员一起沿着的还有自动的“getter”(在var的情况下还有“setter”)。在OP的情况下,自动getter被称为getContext(),但基类已经有了getContext()(相同的签名)。
最有可能的是,这里的意图只是将context传递给super,在这种情况下,另一个答案效果最好。但是,如果需要一个新的属性,但是所选择的名称与super的不同用途的成员冲突,则更改名称是另一种选择。

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

huus2vyu

huus2vyu3#

我得到了一个类似的错误,我通过从构造函数参数中删除空检查来解决它

来自

fun onChildDraw(
    c: Canvas?,
    recyclerView: RecyclerView?,
    viewHolder: RecyclerView.ViewHolder,
    dX: Float,
    dY: Float,
    actionState: Int,

fun onChildDraw(
    c: Canvas,
    recyclerView: RecyclerView,
    viewHolder: RecyclerView.ViewHolder,
    dX: Float,
    dY: Float,
    actionState: Int,
hivapdat

hivapdat4#

将变量名更改为myContext,并将与您一起工作,没有任何问题。

e37o9pze

e37o9pze5#

我想在这里补充一点:
当你将参数命名为context时,它将与基类参数名冲突,默认情况下基类参数名也是context。因此,更改参数的名称将对您有所帮助。

laximzn5

laximzn56#

这两个函数的返回类型是ContextContext!,这是两个不同的东西。要修复它,请在代码中添加感叹号。

kadbb459

kadbb4597#

有类似的问题,什么工作是确保我的targetSdkVersioncompileSdkVersion是相同的所有模块。

odopli94

odopli948#

根据@hotkey的回答...在这个特殊的例子中,我相信原因是因为OP做了以下事情:

private var _context: Context? = null
    private val context get() = _context!!

在父类已经定义了public/protected方法“getContext()"的子类上。
我遇到了同样的情况,并使用了@hotkey的建议,但针对特定的用例,只需注解getter本身:

@get:JvmName("getContext2")
    private val context get() = _context!!

这个注解确保创建的自动getter具有与父getter不同的名称,而不会影响您的语法/上下文的使用。
希望能帮上忙!

e3bfsja2

e3bfsja29#

1.请更改你的上下文名称,因为你的参数作为上下文,它将与基类参数名称,这也是上下文默认情况下推翻。因此,更改参数的名称将对您有所帮助。

from: 
var context: Context? = null

to:
var contextVideoFragment: Context? = null

相关问题