Modificar el comportamiento de List.get en Kotlin

En Kotlin, ¿cuál es la forma idiomática de modificar el comportamiento de List.get modo que llamar a get(-1) devuelve el último elemento de la list?

Probé una extensión:

 operator fun <T> List<T>.get(index: Int): T { return this[if (index < 0) size + index else index] } 

Pero no se comportó como se desea, y recibí la advertencia

 scratch.kts:3:26: warning: extension is shadowed by a member: public abstract operator fun get(index: Int): T operator fun <T> List<T>.get(index: Int): T { ^ 

Como no puede ocultar un método de miembro con un método de extensión, la única opción que funcionará sería tener una subclass que anule la funcionalidad en la forma que describe.

 class NegativelyIndexableList<T> : ArrayList<T>() { override fun get(index: Int): T = if (index < 0) super.get(size + index) else super.get(index) } 

Sin embargo, debe considerar a los futuros usuarios de este código. Ofusca lo que está pasando aquí. El significado de la list[index] cambia en function del valor del index , y esto no será obvio en los lugares donde la list o el index no se conocen de antemano. Considera este ejemplo trivial:

 fun getValueFromAFewDaysAgo(timeline: List<Day>, today: Int, daysAgo: Int) = timeline[today - daysAgo] 

Si today es 2 y daysAgo es 7, este método arrojará una exception (si la timeline es una list regular) o devolverá algo del futuro (si la timeline timeline es una Lista NegativelyIndexableList ).

Si realmente tiene que tener esta característica, entonces considere no combinarla con get . Agrega un nuevo método:

 fun getFromEnd(index: Int) = asReversed()[index] 
  • Sugar ORM, ¿Listar todo en Kotlin? Java funciona, pero Kotlin no
  • Tiempo de ejecución obsoleto de Kotlin
  • Kotlin: Saltando Corutinas
  • No se puede comprimir Rxjava Observables
  • ¿Hay alguna manera de hacer reference a la class de Java para una function de nivel superior de Kotlin?
  • ¿Cómo establecer una preference de valor en Kotlin?
  • Cómo usar la biblioteca kmongo para operador de sector
  • AccessToken.getCurrentAccessToken () siempre devuelve null en Kotlin
  • ¿Puedo usar @Bean de AndroidAnnotation dentro de Kotlin?
  • Kotlin: cómo validar la class de datos
  • Convierta un file groovy build.gradle existente en un build basado en kotlin build.gradle.kts