kotlin 意外覆盖:以下声明在特定类层次结构上具有相同的JVM签名错误

qyuhtwio  于 11个月前  发布在  Kotlin
关注(0)|答案(3)|浏览(160)

在这里我发现了许多类似的问题,但没有一个解决方案对我没有帮助,因为我的问题的细节。我有下面的类层次结构:
第一个月

public interface ParentInterface {
    void setMessages(Collection<String> var1);
}

字符串
com.package.ParentClass.java

public class ParentClass {
    protected Collection messages;

    public void setMessages(Collection messages)
    {
        this.messages = messages;
    }
}


com.package.ChildClass.java

public class ChildClass extends ParentClass implements ParentInterface {
}


com.package.KotlinClass.kt

class KotlinClass: ChildClass()


在最后一个Kotlin类中,我遇到了以下错误:“Class 'KotlinClass'不是抽象的,也没有实现基类成员public abstract fun setMessages(var 1:(Mutable)Collection!):Unit defined in com.package.ChildClass.
当我接受使用IDE生成方法实现的建议时,我有:
override fun setMessages(var1: MutableCollection<String>?) { }
我在生成的方法上得到以下错误:
意外覆盖:以下声明具有相同的JVM签名(setMessages(Ljava/util/Collection;)V):

public open fun setMessages(messages:(MutableCollection.. Collection<>?)):在com.package.KotlinClass中定义的单元
*public open fun setMessages(var 1:MutableCollection?):在com.package.KotlinClass中定义的单元

而且我只能修改KotlinClass,因为其他类都是Java中第三方库的类,请帮帮忙,我已经在这个问题上花了很多时间。

mv1qrgav

mv1qrgav1#

你可以用纯Kotlin克服这个限制,但是你会在过程中失去一些功能/可能会在过程中引入一些不必要的但明显的错误,所以你应该在继续之前真正调查这个方法的使用情况,因为你需要基本上完全“切断”这个方法以修复编译错误。
因此,在您的特定情况下,我知道您在Kotlin上为Jira开发Atlassian插件。这是必不可少的,因为我们知道这种方法可以在您的情况下避免。
问题类为:com.atlassian.jira.web.action.JiraWebActionSupport
接口:com.atlassian.jira.util.ErrorCollection
而罪魁祸首的方法是:void setErrorMessages(Collection<String> var1);
父类为webwork.action.ActionSupport
它包含protected Collection errorMessages;
这就是你如何切断这条死肢:

open class SpecificAction : JiraWebActionSupport() {
    override fun setErrorMessages(p0: MutableCollection<String>?) = TODO()
    ...
}

字符串
在你的情况下,Java覆盖当然更可取,因为你不会丢失任何东西,也不会引入潜在的错误,但如果你只需要Kotlin,并确保你不/不会使用这个方法-这个小肮脏的黑客将有所帮助。

xcitsw88

xcitsw882#

我有一个类似的问题,但它是在如何类的内在性正在制定。它涉及到一个函数getInfo被定义为空和nonullable参数。

class ChangeFormNPC(input: ByteBuffer, flags: Flags.Int, context: ESSContext) : ess.GeneralElement(), ChangeFormData {
override fun getInfo(analysis: resaver.Analysis?, save: ess.ESS?): String { return ""}
}

字符串
我的意思是,在上面的类定义中,ess.GeneralElement()是问题发生的地方。
在另一个班级

open class GeneralElement protected constructor() : Element {
open fun getInfo(analysis: Analysis, save: ESS): String { return "" }
}


观察到错误消息

<somepath>\ChangeFormNPC.kt: (42, 5): Accidental override: The following declarations have the same JVM signature (getInfo(Lresaver/Analysis;Less/ESS;)Ljava/lang/String;):
    fun getInfo(analysis: Analysis, save: ESS): String defined in ess.ChangeFormNPC
    fun getInfo(analysis: Analysis?, save: ESS?): String defined in ess.ChangeFormNPC


令人困惑的部分(至少对当时的我来说)是,它显示了具有不同空属性的相同函数。
修复方法是在GeneralElement类中的getinfo的参数中添加nullable说明符。这使得getinfo函数相等并删除了错误。

hpcdzsge

hpcdzsge3#

我在使用与Java交互的类时,在Kotlin中遇到了JVM签名冲突。问题是在Kotlin到Java字节码编译后,两个setErrorMessages方法具有相同的JVM签名。为了解决这个问题,我扩展了一个Java类并覆盖了Kotlin中的方法,以确保兼容性并避免冲突。下面是解决方案:

public class KotlinJiraWebActionSupport extends JiraWebActionSupport {

  @Override
  public void setErrorMessages(Collection errorMessages) {
    this.errorMessages = errorMessages;
  }
}

字符串

相关问题