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() } 
  • Se llama a Kotlin OnTouchListener pero no anula el funcionamientoHaga clic en
  • kartlin startactivity con banderas
  • ¿Puede JRebel volver a cargar las classs de Kotlin cuando son utilizadas por el plugin kotlin-maven-plugin en maven?
  • Operador elipsis Equivalencia Java en Kotlin
  • Referencia no resuelta: T
  • No se puede "findViewById" en Kotlin. Obteniendo el error "Falló la inferencia de tipo"
  • Kotlin Annotation IntDef
  • Lista de types incompatibles de Kotlin <Cualquier> y Lista <Comparable <{com.cognitect.transit.Symbol & com.cognitect.transit.Keyword}>?>
  • Devuelve valor para una variable que aparentemente puede ser nula pero realmente no puede
  • ¿Es posible usar funciones de order superior con arguments opcionales?
  • La habilitación de la security del método global Spring Security interrumpe la dependency injection (con Kotlin)