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

2022-09-04 23:16:38

我遇到了以下错误,试图扩展 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")
  }
  <...>
}

其中 是一个接口,在 Java 中定义,如下图所示:GraphQLError

public interface GraphQLError {
  String getMessage();
  <...>
}

似乎它与 中的定义相冲突。getMessage()Throwable

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

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


PS:我也尝试了以下方法,并收到了一个非常相似的错误:

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

答案 1

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

Reimplement GraphQLError, ExceptionWhileDataFetching and DataFetcherErrorHandler.

KGraphQLError 是一个“固定”的 kotlin 接口(使用 val 而不是 getters),用于自定义错误。

在 KDataFetcherErrorHandler 中:将此行替换为 :ExceptionWhileDataFetchingKExceptionWhileDataFetching
val error = ExceptionWhileDataFetching(path, exception, sourceLocation)

KExceptionWhileErrorHandling实现。浏览代码并将 的所有实例替换为GraphQLErrorif (exception is GraphQLError)(exception is KGraphQLError)

将 new 传递给你的查询ExecutionStrategy 和 mutationExecutionStrategy。KDataFetcherErrorHandler

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

更多信息在这里: http://graphql-java.readthedocs.io/en/latest/execution.html


答案 2

我认为当消息不是一个类(Throwable)中的字段而另一个类中的方法时,它会起作用。但似乎 kotlin 无法解决消息是类中的字段和接口中的方法时的歧义。如果你可以控制你的 GraphQlError,你可以这样做:

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

interface GraphQLError {
    val message: String?
}

推荐