Это случай неоднозначности разрешения перегрузки, и компилятор kotlin не может определить, используете ли вы свойство или метод.
Это из-за вызываемых ссылок (: :).Внутренне, когда вы используете вызываемые ссылки, он вызывает метод.
Вызываемые ссылки : Ссылки на функции, свойства и конструкторы, помимо внутреннего анализа структуры программы, также могут вызываться или использоваться как экземпляры типов функций.
Общий супертип для всех вызываемых ссылок: KCallable , где R - это тип возвращаемого значения, который является типом свойства для свойств, и созданный тип для конструкторов.
KCallable<out R> // supertype for all callable references
Итак, для функции типом является KFunction , а для свойств типом является KProperty
interface KFunction<out R> : KCallable<R>, Function<R> (source)
interface KProperty<out R> : KCallable<R> (source)
Когда вы используете такую функцию, как:
fun context(appContext: Context) = apply {
context = appContext
}
Может использоваться как ссылка на функцию
::context // This is a Function reference i.e. KFunction
При использовании ссылки на свойство, например
private lateinit var context: Context
fun something(){
::context // this is a property reference, KProperty
}
Ссылка на свойство может использоваться, когда функция с одниможидаемый параметр:
val strs = listOf("a", "bc", "def")
println(strs.map(String::length))
Таким образом, Kotlin не заставляет вас использовать разные имена свойств и функций («хотя это не рекомендуется»).Просто в этом случае его невозможно различить как
- Оба являются KCallable и имеют одинаковые имена
- Ссылка на свойство может использоваться, когда ожидается функция с одним параметром