我正在尝试为我的应用中的所有RecyclerView.Adapter
使用通用扩展功能,因此我创建了一个名为notifyAdapter的扩展功能,但它没有按预期工作。
fun <T> RecyclerView.Adapter<RecyclerView.ViewHolder>.notifyAdapter() {
updateAll()
notifyDataSetChanged()
}
当我使用
时 offlineListAdapter.notifyAdapter()
或onlineListAdapter.notifyAdapter()
它抛出
无法应用于接收方OfflineListAdapter
OfflineListAdapter.kt
class OfflineListAdapter : RecyclerView.Adapter<OfflineListAdapter.OfflineListHolder>() {
class OfflineListHolder(view: View) : RecyclerView.ViewHolder(view) {
}
}
如何使用Generics为所有RecyclerView.Adapter
创建公共扩展功能。
提前致谢。
答案 0 :(得分:1)
有几种方法可以做到这一点。
您可以使用ViewHolder
差异标记out
参数。这样,您的函数不是通用的,因此您无法访问其中ViewHolder
的确切类型。
fun RecyclerView.Adapter<out RecyclerView.ViewHolder>.notifyAdapter() { ... }
或者,您可以为函数设置泛型类型参数,该函数必须是ViewHolder
的子类。这样您就可以在函数中使用T
,例如,如果您愿意,可以创建listOf<T>()
。
fun <T : RecyclerView.ViewHolder> RecyclerView.Adapter<T>.notifyAdapter() { ... }
最后,你也可以使用星形投影,我相信在这种情况下会给你与第一个解决方案完全相同的结果,因为Adapter
类的类型参数的上限是ViewHolder
。
fun RecyclerView.Adapter<*>.notifyAdapter() { ... }
您可以在官方文档here中详细了解差异和预测。