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

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

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

Они похожи:

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

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

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

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

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

    Kotlin имеет аннотацию @JvmName специально для этого типа прецедента. В Котлине нет проблемы, потому что она знает разницу между этими методами. Но для байт-кода, совместимого с Java, был бы конфликт для именования, так как генерические подписи были бы идентичны.

    Поэтому вам нужно использовать эту аннотацию для управления именем с точки зрения Java и JVM. Ваш код Kotlin не увидит это альтернативное имя и будет использовать имя по вашему желанию.

    Измените свой код на:

     @JvmName("somethingIntToJson") fun Something<Int>.toJson(): String = ... @JvmName("somethingDoubleToJson") fun Something<Double>.toJson(): String = ... 

    Из Котлина, используйте обычно:

     val someIntyThing = Something<Int>(194) val json = someIntyThing.toJson()