为什么Kotlin无法重载List 操作符方法?

这是我的function:

operator infix fun List.get(int: Int): Teacher { var t = Teacher() t.name = "asd" return t ; } 

和我的用法:

 b[0].teachers[1].name 

提示:b是List 属性的对象

并且错误Empty list doesn't contain element at index 1.

为什么这个覆盖操作函数不起作用?

在Kotlin中,你不能用扩展名来影射一个成员函数。 会员总是赢得通话解决。 所以,你基本上不能调用与成员函数签名相同的扩展名,这个扩展名存在于为expression式声明或推断的types中。

 class C { fun foo() { println("member") } } fun C.foo() { println("extension") } C().foo() // prints "member" 

在你的情况下,成员函数是abstract operator fun get(index: Int): Ekotlin.collections.List定义。

请参阅语言参考: 扩展是静态解析的

正如voddan在评论中提到的那样,你不能用一个扩展来掩盖方法。 但是,有一种方法可以解决这个问题。 我不认为我会建议你这样做,但我想这展示了一个很酷的Kotlinfunction。

如果b[0]返回一个Btypes的对象,你可以在这个类中做到这一点:

 data class B(private val _teachers: List = emptyList()) { private class Teachers(private val list: List) : List by list { override operator fun get(int: Int): Teacher { var t = Teacher() t.name = "asd" return t ; } } val teachers: List = Teachers(_teachers) } fun main(args: Array) { println(B().teachers[0].name) // Prints "asd" } 

当我重写get函数时,会影响所有使用B类的人,而不仅仅是导入扩展函数的地方。

请注意,我正在将Teachers -class上的所有其他方法调用委托给基础列表。