我有以下简单的 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> // ??
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)