Подтвердить что ты не робот

У меня есть два метода расширения Kotlin для одного и того же класса, но с разными генерическими сигнатурами и компилятор жалуется

Я пишу две функции расширения для одного и того же класса:

class Something<T:Any> { ... }

Они выглядят так:

fun Something<Int>.toJson(): String = ...
fun Something<Double>.toJson(): String = ...

И приводит к ошибке компилятора:

Kotlin: конфликт объявления платформы: следующие объявления имеют одну и ту же подпись JVM

Как я могу создать две функции расширения с различной сигнатурой generics? или это невозможно?

Примечание: этот вопрос намеренно написан автором и автору (Автоответчик), так что ответы на часто задаваемые вопросы Темы Котлина представлены в SO. Он возник из Kotlin slack #general channel.

4b9b3361

Ответ 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()