在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 {
^
答案 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