¿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"

  • Hay alguna biblioteca para trabajar con mónadas en kotlin?
  • Sistema local de administración de packages Java en Python PIP style?
  • Herencia genérica de Kotlin
  • Convierta la function de Scala a la function de Kotlin
  • La creación de Gradle falló con Kotlin, Scala y Java
  • Comstackción manual de JAR para Scala & Kotlin
  • Companion se beneficia de la posibilidad de implementar interfaces
  • Scala require () equivalente en Kotlin
  • Tipo de function con receptor en Scala
  • Genéricos reificados en Scala 2.10
  • ¿Por qué Kotlin comstack más rápido que Scala?