Свойство 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> // ??