“意外覆盖:以下声明具有相同的JVM签名”在实现Java接口时
我遇到了以下错误,试图扩展RuntimeException,并从我的Kotlin代码实现Java中定义的GraphQLError接口。 这是错误的:
意外覆盖:以下声明具有相同的JVM签名(getMessage()Ljava.lang.string;):
public open fun (): String? defined in NegativeCountException
public open fun (): String? defined in NegativeCountException
public open fun getMessage(): String? defined in NegativeCountException
public open fun getMessage(): String? defined in NegativeCountException
以下是我的代码:
class NegativeCountException() : RuntimeException(), GraphQLError { override fun getMessage(): String? { TODO("not implemented") } }
其中GraphQLError
是一个接口,在Java中定义,如下所示:
public interface GraphQLError { String getMessage(); }
似乎与Throwable
定义的getMessage()
冲突。
我不能更改接口的代码,因为它来自一个库。
我如何创建自己的运行时exception,将实现GraphQLError ?
PS:我也尝试了以下,并收到了一个非常类似的错误:
class NegativeCountException(override val message: String?) : RuntimeException(), GraphQLError { }
这是因为当生成Java字节码时,Kotlin将为您的variables创建getter和setter。 例如,
class Foo(val bar)
在Java字节码中使用getBar
。 为避免名称冲突,请使用@JvmField
和@JvmName
。
阅读更多关于这里 。
我认为这是可行的,当消息不是一个类中的字段(Throwable)和另一个中的方法。 但是,似乎kotlin无法解决消息是类中的字段和接口中的方法时的歧义。 如果你能控制你的GraphQlError,你可以这样做:
class NegativeCountException() : RuntimeException(), GraphQLError { override val message: String? get() = super.message } interface GraphQLError { val message: String? }