¿Cómo funcionan las funciones de extensión de Kotlin?

Digamos que quiero un número integer que proporcione un método square .

Kotlin :

 fun Int.square() = this * this 

uso:

 println("${20.square()}") 

doc:

Las extensiones en realidad no modifican las classs que extienden. Al definir una extensión, no inserta nuevos miembros en una class, sino que simplemente hace que nuevas funciones se puedan llamar con la notación de puntos en variables de este tipo.

Nos gustaría enfatizar que las funciones de extensión se envían estáticamente

Mi expectativa habría sido que simplemente lo agreguen a las funciones miembro de la class extendida durante la compilation, pero eso es lo que niegan explícitamente, así que mi siguiente pensamiento fue que podría ser "algo así" como las implicaciones de scala.

Scala :

 object IntExtensions{ implicit Class SquareableInt(i:Int){ def square = i*i } } 

uso:

 import IntExtensions._ 

y entonces

 println(f"${20.square}") 

doc:

Una class implícita se desaparece en una class y un emparejamiento de método implícito, donde el método implícito imita al constructor de la class.

El método implícito generado tendrá el mismo nombre que la class implícita.

Pero Scala implicits crea una nueva class, que inhabilitaría el uso de this .

Entonces … ¿cómo es que Kotlin extiende las classs? "Hacer llamable" no me dice mucho.

En su caso, Kotlin simplemente crea classs simples utilitarias con el nombre " nombre de file" Kt y el método estático " int square (int x) " (java pseudo-código)

Desde Java se ve algo como esto

 // filename int-utils.kt final class IntUtilsKt { public static int square(int x) { return x * x; } } 

Y después de esto todas las llamadas a

  val result = 20.square () 

se transformará (en el nivel de código de bytes) para

  val result = IntUtilsKt.square (20); 

PD Puedes verlo tú mismo usando la acción de IDEA "Mostrar código de byte Kotlin"

  • ¿Por qué Kotlin comstack más rápido que Scala?
  • Scala require () equivalente en Kotlin
  • Forma equivalente de Scala de Rango a class personalizada
  • Comstackción manual de JAR para Scala & Kotlin
  • Progtwigción funcional: cómo continuar el context para una cadena de reglas de validation
  • Usar varios lenguajes JVM en el mismo proyecto
  • Kotlin zipToda alternativa
  • Tipo de function con receptor en Scala
  • Genéricos reificados en Scala 2.10
  • ¿Existe un análogo Future.sequence en kotlin?
  • Kotlin VS Scala: Implementar methods con parameters constructor primarios