Funciones de extensión Kotlin por tipo

¿Cuál es la forma idiomática de agregar una function a una class según el tipo? El siguiente ejemplo usa List como class, y Type Parameter <T> es la class de objects dentro de la list. Digamos que desea orderar cada una de estas lists con un comparador diferente según su tipo.

 data class A(val foo: String) data class B(val bar: Int) private val aComparator: Comparator<A> = Comparator { lhs, rhs -> rhs.foo.compareTo(lhs.foo) } private val bComparator: Comparator<B> = Comparator { lhs, rhs -> rhs.bar.compareTo(lhs.bar) } fun <T: A> List<T>.sort(): List<T> { return this.sortedWith<T>(aComparator) } fun <T: B> List<T>.sort(): List<T> { return this.sortedWith<T>(bComparator) } 

Esto da un error al decir que ambas funciones de sorting tienen las mismas firmas debido a las reglas de sobrecarga de Java. En Java podría darles dos nombres identificables diferentes, pero es bastante feo como las extensiones de Kotlin (egasortA () b.sortB ()). Kotlin no muestra sortA en una list <B>, por lo que parece que habría una forma mejor de escribir sort () para manejar diferentes comparadores en diferentes objects.

El ejemplo es bastante simple, pero imagine si no tengo acceso para modificar las classs A y B, por lo que no podría usar la inheritance o implementar una interfaz en ellas. También pensé en agregar un comparador a cada class y usar Any? Pero eso parece engorroso también.

Una respuesta parece ser:

 @JvmName("sortA") fun <T: A> List<T>.sort(): List<T> { return this.sortedWith<T>(aComparator) } @JvmName("sortB") fun <T: B> List<T>.sort(): List<T> { return this.sortedWith<T>(bComparator) } 

Esto parece solucionar el problema de Java con el borrado de tipo genérico.

Se encuentra aquí: https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

En este sitio, encontré esta solución

En lugar de esto

 fun Iterable<Long>.average(): Double {} fun Iterable<Int>.average(): Double {} 

Usa el nombre de plataforma

 fun Iterable<Long>.average(): Long { } platformName("averageOfInt") fun Iterable<Int>.average(): Int { } 

EDITAR: Esto está en desuso, use JvmName en su lugar.

  • El resultado es el mismo, pero el caso de testing no pasa en la testing unitaria
  • Métodos de interfaz de anulación de Android kotlin dentro del método onCreateView ()
  • Kotlin - Extensión para la class final
  • Funciones de extensión para classs genéricas en Kotlin
  • Miembro de Kotlin y extensión al mismo time
  • Cómo corregir la firma del método de extensión genérico en kotlin para resolver "Falló la inferencia de tipo" en kotlin
  • ¿Cómo extiendo la class Kotlin Number o uso generics para crear un getter de propiedad simple que operará en todas las subclasss Number?
  • ¿Funciones de extensión Kotlin contra funciones miembro?
  • Propiedades de extensión de Kotlin no reconocidas en V1.0.1
  • Propiedad de extensión en línea Kotlin
  • Establecer una extensión de kotlin