Compartir implementaciones de funciones de extensión entre Float y Double en Kotlin

NOTA: Esta pregunta no se trata de classs genéricas, se trata de funciones genéricas. (No creo que sea un duplicado de este : es más específico que eso).

En nuestro proyecto, tenemos un puñado de funciones de utilidad para extender Double y Float , como toFixed (inspirado en Javascript's Number.toFixed ).

 fun Double.toFixed(digits: Int):String = java.lang.String.format("%.${digits}f", this) fun Float.toFixed(digits: Int):String = java.lang.String.format("%.${digits}f", this) 

Como puede ver, Double.toFixed y Float.toFixed tienen una implementación idéntica.

Debido a que hay varias otras funciones de extensión más complicadas como esta, las mejoras y las correcciones de errores en una versión (por ejemplo, Double.toPrecision ) deben mantenerse sincronizadas manualmente (con Float.toPrecision ), lo cual es aburrido y propenso a errores.

Experimenté con mover las implementaciones duplicadas a una function compartida <templated> , pero (con razón) no puede acceder a this en el context de una function independiente.

Para ilustrar, esperaba algo como esto:

 private fun <T>toFixed(digits: Int):String = java.lang.String.format("%.${digits}f", this) fun Double.toFixed = ::toFixed<Double> fun Float.toFixed = ::toFixed<Float> 

Si cualquier idioma puede sacudir esto, ¡seguramente Kotlin sí puede! ¿Pensamientos?

    Se puede lograr una extensión en un tipo genérico mediante el uso de fun <T> T.toFixed(...) . Haciendo eso, this es accesible.

    El problema es que la extensión se puede usar en cualquier tipo. Puede usar límites superiores en su T para restringirlo:

    fun <T: Number> T.toFixed(...)

    Si realmente tiene que restringir la extensión a Float y Double solo es necesario ampliar los types concretos. Eche un vistazo a la biblioteca de math Koltin además, podría ser útil 🙂 (Disponible con 1.2-Beta ):
    https://github.com/JetBrains/kotlin/blob/master/js/js.libraries/src/core/math.kt