Si tengo un jar, en el classpath, donde he creado una función de extensión en la clase String por el bien del argumento y tengo otro jar con la misma función de extensión en String, ¿cómo resolverá Kotlin los dos?
Supongo que si ambas funciones están definidas en los mismos paquetes, ¿habrá un conflicto?
Pero si son paquetes diferentes, ¿cómo puedo distinguir las dos extensiones?
De hecho, si están en el mismo paquete, no se compilará. Para el otro escenario, supongamos que tiene dos archivos con dos paquetes diferentes, que contienen funciones de extensión con la misma firma:
Primer archivo:
package ext1 fun Int.print() = print(this)Segundo archivo:
package ext2 fun Int.print() = print(this * 2)Y este archivo donde estás tratando de usarlo:
package main fun main(args: Array<String>) { 42.print() }IntelliJ en realidad le dará un cuadro de diálogo de importación donde puede elegir cuál desea usar:
Puedes importar uno de ellos así:
import ext1.print Y si necesita usar el otro también, puede cambiarle el nombre con la palabra clave as . Esta palabra clave sirve para importaciones en general, clases con el mismo nombre, etc.
import ext2.print as print2 Entonces este programa compila e imprime 4284 :
package main import ext1.print import ext2.print as print2 fun main(args: Array<String>) { 42.print() 42.print2() } Como nota rápida, la que importa con la palabra clave as será un poco más difícil de usar, ya que la función de autocompletar no parece captarla bien, al seleccionar la segunda opción aquí solo se completa la llamada a 42.print() .
Entonces, dado que la función de extensión en kotlin es solo una función estática, otras funciones se distinguirán por importación.
También puede crear un alias para una de las funciones de extensión para una mayor legibilidad:
import by.bkug.extensions.helpers.extension import by.bkug.extensions.extension as extension1 fun test() { myType().extension() // by.bkug.extensions.helpers.extension myType().extention1() // by.bkug.extensions.extension }