Any way to achieve something like overriding an operator in kotlin?
最近,我在Kotlin处理列表,并有以下片段:
1 2 | a = listOf(1, 2, 3, 4) println(a[-2]) |
当然,这会导致
1 2 3 4 | operator fun <T> List<T>.get(index: Int): T = // Here this should call the non-overridden version of // get. get(index % size) |
号
我理解扩展只是静态方法,因此不能被重写,但是有没有一种方法可以实现这样的事情?
当然,您可以创建另一个函数
1 | fun <T> List<T>.safeGet(index: Int): T = get(index % size) |
但我想知道是否还有其他的方法。
(我知道
编辑
当我编写这个问题时,我认为当右手边为正数时,
由于
1 2 3 4 5 6 7 | fun main(args: Array<String>) { val a = listOf(1, 2, 3, 4) println(a(-2)) } // If `index` is negative, `index % size` will be non-positive by the definition of `rem` operator. operator fun <T> List<T>.invoke(index: Int): T = if (index >= 0) get(index % size) else get((-index) % (-size)) |
尽管我认为用适当的名称为
旁注,
您正在尝试一些不可能的方法,因为扩展总是被成员隐藏,即使是
解决方法:使用第二个解决方案,或者添加一个不好看(看起来像
另一个解决方案:创建自己的