Параллельный обнуляемый и ненулевой метод с тем же именем - PullRequest
0 голосов
/ 22 февраля 2019

Я хотел бы предложить два метода с одним и тем же именем, которые могут принимать необязательные или необязательные входные данные:

class Formatter {
    fun format(input: Number?) : String? {return number?.toString()}
    fun format(input: Number) : String {return number.toString()}
}

Видимо, это невозможно из-за ограничений JVM:

Платформаконфликт объявлений: следующие объявления имеют одинаковую сигнатуру JVM (test (Lorg.example.Number;) Ljava / lang / String;):

Существует ли читаемый обходной путь для достижения той же цели?Мое текущее решение состоит в том, чтобы переименовать один метод (например, formatNonNull (input: Number)).

Бонус: мой класс Formatter фактически написан на Java и выглядит следующим образом:

class Formatter {
    @Nullable String format(@Nullable Number input) : String {return number != null ? number.toString(): null;}
}

Itдолжно быть расширено ненулевым вариантом:

@NonNull String formatNonNull(@NonNull Number input) : String {return number.toString();}

Есть ли способ улучшить это, то есть без введения нового имени (например, с расширением kotlin)?

1 Ответ

0 голосов
/ 23 февраля 2019

Есть хитрый способ исправить это на JVM:

class Formatter {
    fun format(input: Number?) : String? {return number?.toString()}
    @JvmName("-formatNonNull") fun format(input: Number) : String {return number.toString()}
}

Причина, по которой это работает, заключается в том, что - является допустимым идентификатором символа в байт-коде JVM, но не на языке Java.Это означает, что код скомпилируется, и вы сможете вызывать оба метода в Kotlin, но вы не сможете вызывать метод с именем - из Java.Это также устраняет конфликт имен, так как методы будут иметь разные имена в байт-коде.

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