Проблема расширенных функций - PullRequest
0 голосов
/ 28 декабря 2018

Встретить некоторые трудности при использовании функций расширения с существующим Java API.Вот какой-то псевдокод

public class Test {

public Test call() {
    return this;
}

public Test call(Object param) {
    return this;
}

public void configure1() {
}

public void configure2(boolean value) {
}
}

тест Котлина

fun Test.call(toApply: Test.() -> Unit): Test {
return call()
    .apply(toApply)
}
fun Test.call(param: Any, toApply: Test.() -> Unit): Test {
return call(param)
    .apply(toApply)
}
fun main(args: Array<String>) {
val test = Test()
//refers to java method; Unresolved reference: configure1;Unresolved reference: configure2
test.call {
    configure1()
    configure2(true)
}
//refers to my extension function and works fine
test.call(test) {
    configure1()
    configure2(true)
}
}

Почему работает только функция с параметром?какая разница?

1 Ответ

0 голосов
/ 28 декабря 2018

Kotlin всегда будет отдавать приоритет функциям-членам классов.Поскольку Test:call(Object) является возможным совпадением, Kotlin выбирает этот метод, а не вашу функцию расширения.

Функция расширения с добавленным параметром разрешается так, как вы ожидаете, поскольку класс Test не имеет функций-членов.это будет иметь прецедент (без соответствующей подписи), поэтому выбран ваш метод расширения.

Вот ссылка на документацию Kotlin относительно того, как разрешаются функции расширения: https://kotlinlang.org/docs/reference/extensions.html#extensions-are-resolved-statically

...