Kotlin, как преодолеть случайное переопределение при расширении и реализации - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь создать пользовательское исключение в kotlin, а также реализовать интерфейс GraphQLError, для которого требуется метод getMessage ().

Если я пытаюсь реализовать метод, моя IDE предупреждает меня, что:

Accidental override: The following declarations have the same JVM signature (getMessage()Ljava/lang/String;): 
public open fun <get-message>(): String? defined in eu.mojo.presentation2018.error.ShopException
public open fun getMessage(): String defined in eu.mojo.presentation2018.error.ShopException

Но если я уберу это:

Class 'ShopException' is not abstract and does not implement abstract member
public abstract fun getMessage(): String! defined in graphql.GraphQLError

Я искал решение по сети, но все требовали некоторого контроля над полем «сообщение», которое вызывает конфликт.В моем случае этот элемент управления не существует, так как поле сообщения определено в классе исключения, который я пытаюсь расширить.

Вот мое определение класса:

class ShopException(code:ErrorCode) : Exception(), GraphQLError {...}

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Чтобы сохранить большую часть своего кода в Kotlin, я создал класс BaseException в Java, чтобы я мог переопределить errorMessage () вместо getMessage ().Теперь только мой родительский класс находится на Java, а все остальное работает в Kotlin.

Базовый класс Java

import com.fasterxml.jackson.annotation.JsonIgnore;
import graphql.GraphQLError;

public abstract class BaseException extends RuntimeException implements GraphQLError {
    abstract String errorMessage();

    @Override
    public String getMessage() {
        return errorMessage();
    }

    @Override
    @JsonIgnore
    public StackTraceElement[] getStackTrace() {
        return super.getStackTrace();
    }
}

Производный класс Kotlin

class CredentialException : BaseException() {
    override fun errorMessage(): String = "Invalid credentials"
    override fun getErrorType(): ErrorType = ErrorType.ValidationError
    override fun getLocations(): MutableList<SourceLocation>? = null
}
0 голосов
/ 21 августа 2018

В настоящее время (Kotlin 1.2.61) это невозможно.

Вот некоторые проблемы, связанные с этой проблемой, которые, вероятно, еще не получили достаточного внимания (некоторые связаны только с тем, что они скорее упоминают свойства в своем созвездии):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...