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] 
  • Hacer request HTTP onclick en button en Kotlin
  • Java no permite los methods pnetworkingeterminados finales ... pero ¿Kotlin?
  • Timeline Mission no ejecuta misiones
  • Kotlin: Actualizar elemento de list inmutable
  • Patrón de layout de puente que resulta en demasiados generics
  • Fondo de relleno de Android AlertDialog
  • No se pudo deducir Kotlin y RxJava
  • kotlin check tipo types incompatibles
  • NoClassDefFoundError cuando se usa Expuesto
  • ¿Cómo manejar los errores de escritura en Apache Jena?
  • Cómo especificar @Throws para una propiedad en la interfaz