Tengo dos methods de extensión de Kotlin para la misma class, pero con una firma genérica diferente y el comstackdor se queja

Estoy escribiendo dos funciones de extensión para la misma class:

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

Parecen:

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

Y resulta en el error del comstackdor:

Kotlin: conflicto de statement de plataforma: las siguientes declaraciones tienen la misma firma JVM

¿Cómo puedo crear dos funciones de extensión con solo la firma genérica diferente? ¿O acaso no es posible?

Nota: esta pregunta fue escrita y respondida intencionalmente por el autor ( Preguntas de respuesta automática ), por lo que las respuestas a los temas de Kotlin comúnmente formulados están presentes en SO. Se originó en Kotlin slack #general channel.

Solutions Collecting From Web of "Tengo dos methods de extensión de Kotlin para la misma class, pero con una firma genérica diferente y el comstackdor se queja"

Kotlin tiene la anotación @JvmName específicamente para este tipo de caso de uso. En Kotlin, no hay ningún problema porque conoce la diferencia entre los methods. Pero el código de bytes compatible con Java tendría un conflicto para nombrar ya que las firmas borradas genéricas serían idénticas.

Por lo tanto, debe usar esta anotación para controlar el nombre desde la perspectiva de Java y JVM. Su código de Kotlin no verá este nombre alternativo y usará el nombre como lo desea.

Cambia tu código a:

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

De Kotlin, usa normalmente:

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