Свойство Kotlin: "Тип параметра свойства должен использоваться в его типе приемника"
У меня есть следующие простые функции расширения Котлина:
// Get the views of ViewGroup
inline val ViewGroup.views: List<View>
get() = (0..childCount - 1).map { getChildAt(it) }
// Get the views of ViewGroup of given type
inline fun <reified T : View> ViewGroup.getViewsOfType() : List<T> {
return this.views.filterIsInstance<T>()
}
Этот код компилируется и работает отлично. Но я хочу, чтобы функция getViewsOfType
была свойством, как и views
. Android Studio даже предлагает это. Я разрешаю AS выполнять рефакторинг и генерирует этот код:
inline val <reified T : View> ViewGroup.viewsOfType: List<T>
get() = this.views.filterIsInstance<T>()
Но этот код не компилируется. Это вызывает ошибку: "Тип параметра свойства должен использоваться в его типе приемника"
В чем проблема? Поиск справки об этой ошибке, похоже, не приводит к ответу.
Ответы
Ответ 1
Ошибка означает, что вы можете иметь только общий тип типа для свойства расширения, если вы используете указанный тип в типе приемника - тип, который вы расширяете.
Например, у вас может быть расширение, которое расширяет T
:
val <T: View> T.propName: Unit
get() = Unit
Или один, который расширяет тип, который использует T
в качестве параметра:
val <T: View> List<T>.propName: Unit
get() = Unit
Что касается этого, я думаю, причина в том, что свойство не может иметь общий тип параметров, например, функцию. Хотя мы можем вызвать функцию с параметром общего типа...
val buttons = viewGroup.getViewsOfType<Button>()
... Я не считаю, что для свойств существует аналогичный синтаксис:
val buttons = viewGroup.viewsOfType<Button> // ??