Diferenciar extensiones ambiguas en Kotlin

Me encontré con un problema donde el comstackdor "no puede elegir entre los siguientes candidatos" cuando me refiero a rng.max donde rng:IntRange :

 inline val <T:Comparable<T>> ClosedRange<T>.max get() = endInclusive // max of range inline val <T:Comparable<T>> Iterable<T>.max get():T? = max() // max element 

Creo que esto se debe a que un IntRange implementa tanto ClosedRange como (indirectamente a través de IntProgression ) Iterable .

Si quisiera escribir una única function de extensión que se aplicaría a todo IntRange , LongRange y CharRange (presumiblemente pero no necesariamente extendiendo ClosedRange ), ¿hay alguna syntax que pueda agregar que se resuelva inequívocamente a ClosedRange lugar de a Iterable nombre similar? extensión en este caso?

¿Hay alguna syntax que podría agregar que se resolvería inequívocamente en ClosedRange en lugar de la extensión Iterable de nombre similar en este caso?

La distinción debe ser hecha por el cliente en su ejemplo con dos extensiones ambiguas.

Simplemente dígale al comstackdor con qué tipo desea trabajar:

 val intRange = 0..10 (intRange as ClosedRange<Int>).max 

Considera el siguiente código:

 fun Any.someExtensionFunction() = "Any" fun String.someExtensionFunction() = "String" fun main(args: Array<String>) { val s = "xyz" // type String infernetworking println(s.someExtensionFunction()) println((s as Any).someExtensionFunction()) println((s as String).someExtensionFunction()) } 

Salida:

Cuerda
Alguna
Cuerda

Como puede ver, el comstackdor siempre llamará a la function de extensión en el tipo más bajo en la estructura de inheritance a less que explícitamente se indique lo contrario.

Entonces, la respuesta de s1m0nw1 es correcta.

Si desea asegurarse de que el captador ClosedRange siempre se invoque, puede agregar una verificación al captador Iterable . Dado que está en línea, la verificación adicional probablemente se optimizará:

 inline val <T:Comparable<T>> Iterable<T>.max get():T? = when(this) { is ClosedRange<*> -> endInclusive //Specific overload for ClosedRange else -> max() } 
  • ¿Cómo orderar un campo MutableMap por object con save otro campo de object como índice?
  • RecyclerView: implementa correctamente la eliminación de SnackBar UNDO (Kotlin)
  • Kotlin Advertencia de security nula Tokens inesperados (uso; para separar expresiones en la misma línea)
  • multiproyecto gradle: el directory de compilation aparece en el directory raíz que contiene los artefactos de Kotlin
  • El tamaño de RealmResults es cero
  • No puedo ver la variable Kotlin en el estudio Android
  • ¿Cómo utilizar las annotations de tipo de soporte de Android en kotlin?
  • Referencia no resuelta de la function de secuencia de Kotlin
  • Cómo controlar cuándo las importaciones son reemplazadas por comodines en Android Studio en files de Kotlin
  • La inferencia tipo Kotlin falla para la guayaba TreeMultimap
  • Cómo agregar varias instrucciones dentro de una instrucción when en kotlin