Почему Kotlin не может переопределить метод List <*> оператора?

Вот моя функция:

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

и мое использование:

 b[0].teachers[1].name 

tip: b – объект, имеющий свойство List <Teacher>

и Empty list doesn't contain element at index 1. ошибки Empty list doesn't contain element at index 1.

почему эта функция оператора переопределения не работает?

В Kotlin вы не можете затенять функцию-член с расширением. Член всегда выигрывает в разрешении вызова. Таким образом, вы в принципе не можете вызывать расширение с сигнатурой, аналогичной той, что и для функции-члена, которая присутствует в типе, который был объявлен или выведен для выражения.

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

В вашем случае функция-член представляет собой abstract operator fun get(index: Int): E определенный в kotlin.collections.List .

См. Ссылку на язык: Расширения разрешены статически

Как упоминает воддан в комментарии, вы не можете омрачить метод с расширением. Тем не менее, есть способ обойти это с некоторым полиморфизмом. Я не думаю, что я порекомендую сделать это в вашем случае, но, я думаю, это показывает отличную функцию Kotlin.

Если b[0] возвращает объект типа B , вы можете сделать это в этом классе:

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

Когда я переопределяю get -function, это повлияет на всех, кто использует класс B , а не только на то, где вы будете импортировать функцию расширения.

Обратите внимание, что я делегирую все другие вызовы методов в классе « Teachers до основного списка.