“意外覆盖:以下声明具有相同的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? }