Как перегрузить функции с теми же типами параметров, но один можно обнулять - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь добавить две функции расширения к Calendar Классу в Android, чтобы преобразовать определенный шаблон даты и времени в Календарь и наоборот

fun Calendar.fromIsoString(date: String): Calendar = this.apply {
    time = SimpleDateFormat(SERVER_DATE_PATTERN, Locale.US).parse(date)
}

fun Calendar.fromIsoString(date: String?): Calendar? {
    if (date == null) return null
    time = SimpleDateFormat(SERVER_DATE_PATTERN, Locale.US).parse(date)
    return this
}

Но это дает мне следующую ошибку:

Конфликт объявлений платформы: следующие объявления имеют одинаковую подпись JVM (fromIsoString (Ljava / util / Calendar; Ljava / lang / String;) Ljava / util / Calendar;)

Возможно ли иметь эти две функции помимо друг друга?как?

Примечание: я каким-то образом решил проблему, добавив необязательный параметр Unit к одной из функций:

fun Calendar.fromIsoString(date: String?, a: Unit = Unit): Calendar? {
if (date == null) return null
    time = SimpleDateFormat(SERVER_DATE_PATTERN, Locale.US).parse(date)
    return this
}

Но я думаю, что это сложно и не очень хорошая практика!Есть ли лучшее решение?

1 Ответ

0 голосов
/ 23 мая 2018

Существует простое решение, которое позволяет вам делать это без изменения методов или имени, которое вы хотите назвать из Kotlin.

Для Котлина различие между этими двумя методами очевидно, но для JVM это не так.Поэтому просто скажите Kotlin, что вам нужно другое внутреннее имя JVM для одного из методов, которое вообще не повлияет на код Kotlin.Только код Java будет видеть альтернативное имя.Например:

fun Calendar.fromIsoString(date: String): Calendar = this.apply {
    // ... your code without change
}

@JvmName("fromIsoStringNullable") // <-- this solves your problem without changing the name in Kotlin
fun Calendar.fromIsoString(date: String?): Calendar? {
    // ... your code without change
}

вуаля!ошибки больше нет!Вы можете позвонить любой версии из Kotlin с тем же именем someCalendar.fromIsoString(...)

Другие ответы и комментарии, предполагающие, что обнуляемость является синтаксическим сахаром, далеки от правильных.Эти типы записываются в байт-код как дополнительные метаданные, которые только Kotlin будет видеть и применять.Но помимо этого, он также добавляет аннотацию @Nullable к параметру.Фактически, все сгенерированные Kotlin параметры функции имеют аннотации @NotNull и @Nullable в байт-коде, чтобы другие языки или анализаторы могли видеть и применять их, если им это нужно.

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