когда у нас есть функция и оператор invoke который мы пытаемся вызвать из переменнной с типом в котором есть invoke, то вызывается именно invoke, а не функция - при этом компилятор на это никак не ругается(как например в ситуациях когда есть функция и конструктор с одинаковыми сигнатурами)
fun main() {
val doSome = SomeClass()
doSome()
}
fun doSome(){
println("Function invocation")
}
class SomeClass{
operator fun invoke(){
println("SomeClass invocation")
}
}
Этот код выведет: SomeClass invocation
Но! При этом если invoke это extension функция, то вызывается именно обычная функция:
fun main() {
val doSome = "A string"
doSome()
}
operator fun String.invoke(){
println("String invocation")
}
fun doSome(){
println("Function invocation")
}
Этот код выведет: Function inocation
Собственно вопрос: Такое поведение где-то задокументировано? Или это известный баг? На мой взгляд компилятор должен ругаться в таких случаях
При совпадении сигнатур между расширением и мембером, всегда выбирается мембер.
Обсуждают сегодня