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.

  • Usa la extensión Kotlin en la class java de Android
  • Kotlin crea problemas con Android
  • ¿A los miembros protegidos no se puede acceder en las funciones de extensión?
  • ¿Cómo creo una function de extensión en Kotlin, que opera en una class?
  • ¿Cómo colocar una extensión de Kotlin en un file de class?
  • esta reference en un inicializador perezoso de la propiedad de extensión kotlin
  • ¿Cómo verificar la class "instanceof" 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?
  • ¿Hay alguna diferencia entre "object receptor" y "receptor de extensión"
  • Función genérica de extensión de Kotlin con types básicos sin API de reflexión
  • Comtesting si mi actividad está en MultiWindowMode o no está usando Kotlin