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() } 
  • Crea una actividad para iniciar session
  • Dagger 2 en testings de unidad con Kotlin
  • Proporcionar una instancia genérica en Kotlin & Guice
  • ¿Cómo ejecutar código si el object es nulo?
  • Gradle no puede encontrar testings
  • ¿Cómo habilitar la authentication de portador en la aplicación Spring Boot?
  • Kapt no funciona con AutoValue en Android Studio 3.0
  • Aparece el error "No coinciden los types" cuando uso una function como parámetro en Kotlin.
  • @Inject set Not Injecting Property
  • Obtenga un hilo extra de la actividad de Kotlin
  • Error de falta de coincidencia del tipo Kotlin al pasar los arguments desde la terminal