Kotlin属性:“属性的类型参数必须在其接收器类型中使用”

我有以下简单的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>() 

但是这个代码不能编译。 它会导致错误:“属性的类型参数必须在其接收器类型中使用”

这里有什么问题? 搜索这个错误的帮助似乎并没有导致一个答案。

该错误意味着如果您在接收器类型中使用所述类型(即您正在扩展的类型),则只能为扩展属性使用通用类型参数。

例如,你可以有一个扩展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> // ??