Gre*_*nis 14 generics android 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>()
}
Run Code Online (Sandbox Code Playgroud)
此代码编译并正常工作.但是,我希望函数getViewsOfType是一个属性,就像它一样views.Android Studio甚至建议它.我让AS进行重构,它会生成以下代码:
inline val <reified T : View> ViewGroup.viewsOfType: List<T>
get() = this.views.filterIsInstance<T>()
Run Code Online (Sandbox Code Playgroud)
但是这段代码没有编译.它会导致错误:"属性的类型参数必须在其接收器类型中使用"
这是什么问题?搜索有关此错误的帮助似乎不会导致答案.
zsm*_*b13 15
如果您在接收器类型中使用所述类型(您正在扩展的类型),则该错误意味着您只能为扩展属性设置泛型类型参数.
例如,您可以扩展一个扩展T:
val <T: View> T.propName: Unit
get() = Unit
Run Code Online (Sandbox Code Playgroud)
或者扩展T用作参数的类型:
val <T: View> List<T>.propName: Unit
get() = Unit
Run Code Online (Sandbox Code Playgroud)
至于为什么会这样,我认为原因是属性不能像函数一样具有泛型类型参数.虽然我们可以使用泛型类型参数调用函数...
val buttons = viewGroup.getViewsOfType<Button>()
Run Code Online (Sandbox Code Playgroud)
...我不相信属性存在类似的语法:
val buttons = viewGroup.viewsOfType<Button> // ??
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2074 次 |
| 最近记录: |