"意外覆盖:以下声明具有相同的JVM签名"实现Java接口时

时间:2018-02-09 04:22:36

标签: java kotlin kotlin-interop

我遇到以下错误,尝试扩展RuntimeException并使用我的Kotlin代码实现Java中定义的GraphQLError接口。这是错误:

  

意外覆盖:以下声明具有相同的JVM签名(getMessage()Ljava.lang.string;):

     

public open fun <get-message>(): 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();
  <...>
}

似乎与getMessage()中定义的Throwable发生冲突。

我无法更改界面的代码,因为它来自库。

如何创建自己的运行时异常,实现GraphQLError

PS:我也尝试了以下内容,并收到了一个非常类似的错误:

class NegativeCountException(override val message: String?) : RuntimeException(), GraphQLError {
  <...>
}

4 个答案:

答案 0 :(得分:2)

这是一个graphql问题。我的解决方法:

重新实现GraphQLError,ExceptionWhileDataFetching和DataFetcherErrorHandler。

KGraphQLError是一个用于自定义错误的“固定”kotlin接口(使用val代替getter)。

KDataFetcherErrorHandler中的

:将此行中的ExceptionWhileDataFetching替换为KExceptionWhileDataFetching
val error = ExceptionWhileDataFetching(path, exception, sourceLocation)

KExceptionWhileErrorHandling实施GraphQLError。查看代码并将if (exception is GraphQLError)的所有实例替换为(exception is KGraphQLError)

将新的KDataFetcherErrorHandler传递给您的queryExecutionStrategy和mutationExecutionStrategy。

您的自定义错误现在可以扩展Throwable并实现KGraphQLError,并得到妥善处理。

此处有更多信息:http://graphql-java.readthedocs.io/en/latest/execution.html

答案 1 :(得分:1)

我认为当消息不是一个类(Throwable)中的字段和另一个类中的方法时它会起作用。但是当消息是类中的字段和接口中的方法时,似乎kotlin无法解决模糊性。如果您可以控制GraphQlError,则可以执行以下操作:

class NegativeCountException() : RuntimeException(), GraphQLError {
    override val message: String?
        get() = super.message
}

interface GraphQLError {
    val message: String?
}

答案 2 :(得分:0)

这是因为Kotlin在生成Java字节代码时会为变量创建getter和setter。例如,

class Foo(val bar)

Foo,Java字节代码中包含getBar。为避免名称冲突,请使用@JvmField@JvmName

详细了解此here

答案 3 :(得分:0)

有一个快速而肮脏的解决方法,以防您的项目允许Java与Kolin一起使用。 用Java编写您的NegativeCountException:D