У меня есть два метода расширения Kotlin для одного и того же класса, но с разными генерическими сигнатурами и компилятор жалуется
Я пишу две функции расширения для одного и того же класса:
class Something<T:Any> { ... }
Они выглядят так:
fun Something<Int>.toJson(): String = ...
fun Something<Double>.toJson(): String = ...
И приводит к ошибке компилятора:
Kotlin: конфликт объявления платформы: следующие объявления имеют одну и ту же подпись JVM
Как я могу создать две функции расширения с различной сигнатурой generics? или это невозможно?
Примечание: этот вопрос намеренно написан автором и автору (Автоответчик), так что ответы на часто задаваемые вопросы Темы Котлина представлены в SO. Он возник из Kotlin slack #general channel.
Ответы
Ответ 1
Kotlin имеет @JvmName
аннотация специально для этого типа прецедента. В Котлине нет проблемы, потому что она знает разницу между этими методами. Но Java-совместимый байт-код имел бы конфликт для именования, так как генерические подписи были бы идентичны.
Поэтому вам нужно использовать эту аннотацию для управления именем с точки зрения Java и JVM. Ваш код Kotlin не увидит это альтернативное имя и будет использовать имя по вашему желанию.
Измените свой код на:
@JvmName("somethingIntToJson") fun Something<Int>.toJson(): String = ...
@JvmName("somethingDoubleToJson") fun Something<Double>.toJson(): String = ...
От Kotlin, используйте обычно:
val someIntyThing = Something<Int>(194)
val json = someIntyThing.toJson()