修改Kotlin中的List.get行为

时间:2017-08-14 22:20:31

标签: kotlin

在Kotlin中,修改List.get行为的惯用方法是什么,以便调用get(-1)返回列表中的最后一个元素?

我尝试了扩展程序:

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

但它没有按照预期行事,我收到了警告

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 {
                         ^

1 个答案:

答案 0 :(得分:2)

由于您无法使用扩展方法隐藏成员方法,因此唯一可行的选项是使子类以您描述的方式覆盖功能。

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

但是,您应该考虑此代码的未来用户。它确实模糊了这里发生的事情。 list[index]的含义会根据index的值发生变化,而这在预先不知道list和/或index的地方并不明显。考虑一下这个简单的例子:

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

如果today为2且daysAgo为7,则此方法将抛出异常(如果timeline是常规列表)或从未来返回某些内容(如果{{ 1}}是timeline)。

如果您确实需要此功能,请考虑不要将其与NegativelyIndexableList混淆。添加新方法:

get