Я пытаюсь разработать REST API с GraphQL и Kotlin, и я столкнулся со следующей проблемой: я пытаюсь создать собственное исключение, которое расширяет RuntimeException и реализует GraphQLError, а в Kotlin я не могу этого сделать, потому что получаю это: Случайное переопределение при использовании стороннего интерфейса Java и расширение RuntimeException в kotlin.
Я решил эту проблему с помощью обходного пути, создав класс Java для моего CustomException.
Но я не знаю, почему, когда я создаю класс kotlin, который расширяет RuntimeException и реализует GraphQLError, мне нужно переопределить метод getMessage() из GraphQLError, но когда я создаю класс java, который расширяет RuntimeException и реализует GraphQLError, мне не нужно переопределить метод getMessage() из GraphQLError.
Спасибо!
Да, я понимаю эту проблему, но мой вопрос касался другого факта: почему мне нужно переопределить метод getMessage () в Kotlin, но не в Java.




Кажется, что переопределение метода доступа к свойству функцией еще явно не поддерживается. В настоящее время это ошибка по вашей ссылке. В этом легко убедиться на простом примере вроде этого:
class Sample(val message : String) {
fun getMessage() :String = "MyString"
}
Это происходит потому, что свойство message (в вашем случае сообщение от Throwable) и функция getMessage (в вашем случае getMessage из GraphQL) преобразуются в одну и ту же подпись JVM. Мне кажется, что текущее статус-кво таково, что средства доступа к свойствам не рассматриваются как отдельные члены, поэтому их нельзя переопределить функциями-членами или даже реализовать абстрактные функции. Я не уверен, почему это так.
Аннотируйте сообщение с помощью @JvmField, например:
class MyError(@JvmField override val message: String?, private val invalidField: String? = null) : RuntimeException(message), GraphQLError {
override fun getMessage(): String = super.message ?: "no error message set"
override fun getLocations(): List<SourceLocation> = emptyList()
override fun getErrorType(): ErrorType = ErrorType.DataFetchingException
override fun getExtensions(): Map<String, Any> = if (invalidField!=null)
Collections.singletonMap<String, Any>("invalidField", invalidField)
else
Collections.emptyMap()
}
Для лучшего понимания рекомендуется немного пояснить свой ответ.
Пожалуйста, добавьте пояснение к своему ответу.
Я не в Kotlin, но, как я читал, это известная проблема в Kotlin, которая еще не решена: КТ-24822 (и другие)