Método de extensión de Kotlin como alias para el nombre de método largo?

Estoy trabajando en Kotlin usando un object de biblioteca nativa de Kotlin que contiene un método cuyo .nameIsMuchTooLongAndIsStillNotClear . De manera similar a typealias , quiero crear un alias para el método, por lo que puedo referirme a él como algo .shortAndClear . Para complicar las cosas un poco, estas funciones tienen varios parameters, muchos de los cuales tienen valores pnetworkingeterminados que prefiero no preprocesar en un contenedor. Después de más investigaciones, todavía parece que una function de extensión es el path a seguir.

Para utilizar una function de ejemplo que es fácil de probar, digamos que quiero crear una extensión de tipo de alias para String.startsWith que se llama String.beg . Puedo get fácilmente la siguiente solución para trabajar:

 inline fun String.beg(prefix: CharSequence, ignoreCase: Boolean = false) = startsWith(prefix, ignoreCase) // works ok 

Sin embargo, esto parece requerir que enumere todos los arguments y sus valores pnetworkingeterminados, y lo hago para cada sobrecarga. (Las firmas de método real en cuestión son considerablemente más largas con muchos más valores pnetworkingeterminados.) En el espíritu de "no repetir", ¿hay alguna manera de que pueda usar una reference de function a String::startsWith para que no tenga enumerar todos los arguments? He probado varios formularios, pero ninguno funciona:

 // none of these work: fun String.beg = String::startsWith fun String.beg = this::startsWith val String.beg: (CharSequence, Boolean) -> Boolean = String::startsWith 

Actualmente no hay forma de lograr completamente lo que estás tratando de hacer. Si desea mantener sus parameters pnetworkingeterminados, debe hacerlo (como dijo):

 fun String.beg(prefix: CharSequence, ignoreCase: Boolean = false) = startsWith(prefix, ignoreCase) // Or if you know that ignoreCase will be always false, you can pass the value directly to "startsWith() fun String.beg(prefix: CharSequence) = startsWith(prefix, false) 

En cambio, si no tiene parameters pnetworkingeterminados o no le importa si tiene que pasar el valor pnetworkingeterminado cuando invocará la function, puede usar una reference de function.

 val String.beg: (CharSequence, Boolean) -> Boolean get() = this::startsWith // If the parameters can be infernetworking, you can avoid the type specification. // In this case it won't compile because there are several combinations for "startsWith()". val String.beg get() = this::startsWith 

En este caso, no puede especificar el valor pnetworkingeterminado de un parámetro porque beg es un lambda.

Desde Kotlin 1.2 (actualmente en beta), puede evitar especificar this en una reference de function. Los mismos ejemplos escritos anteriormente pero en Kotlin 1.2:

 val String.beg: (CharSequence, Boolean) -> Boolean get() = ::startsWith // If the parameters can be infernetworking, you can avoid the type specification. // In this case it won't compile because there are several combinations for "startsWith()". val String.beg get() = ::startsWith 
  • acceso al método de extensión kotlin en otro kt
  • ¿Cómo se pueden agregar methods estáticos a las classs de Java en Kotlin?
  • Acceso a la function de extensión de Kotlin Campo privado de Java
  • Kotlin - Extensión para la class final
  • Los generics de Kotlin esperan un tipo inesperado
  • Miembro de Kotlin y extensión al mismo time
  • ¿Convertir mi proyecto de estudio andorid existente a kotlin?
  • Kotlin: ¿Cuando la function de extensión oculta la implementación pnetworkingeterminada de la class?
  • ¿Cómo colocar una extensión de Kotlin en un file de class?
  • ¿Los methods de extensión y las properties de extensión son malas prácticas?
  • Funciones de extensión en types anotados