Существует простое решение, которое позволяет вам делать это без изменения методов или имени, которое вы хотите назвать из 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
в байт-коде, чтобы другие языки или анализаторы могли видеть и применять их, если им это нужно.