我正在尝试对我的应用程序中的所有RecyclerView.Adapter使用通用扩展功能,因此我创建了一个名为notifyAdapter的ext娱乐程序,但它没有按预期工作。

fun <T> RecyclerView.Adapter<RecyclerView.ViewHolder>.notifyAdapter() {
    updateAll()
    notifyDataSetChanged()
}

当我使用
offlineListAdapter.notifyAdapter()onlineListAdapter.notifyAdapter()
它抛出



OfflineListAdapter.kt
    class OfflineListAdapter : RecyclerView.Adapter<OfflineListAdapter.OfflineListHolder>() {

      class OfflineListHolder(view: View) : RecyclerView.ViewHolder(view) {

      }
    }

如何使用泛型为所有RecyclerView.Adapter创建通用扩展功能。

提前致谢。

最佳答案

有两种方法可以做到这一点。

  • 您可以使用ViewHolder方差标记out参数。这样,您的函数就不是通用的,因此您将无法访问其中的ViewHolder的确切类型。
    fun RecyclerView.Adapter<out RecyclerView.ViewHolder>.notifyAdapter() {  ...  }
    
  • 或者,您可以为该函数具有一个通用类型参数,该参数必然是ViewHolder的子类。这样,您可以在函数内部使用T,例如,您可以根据需要创建listOf<T>()
    fun <T : RecyclerView.ViewHolder> RecyclerView.Adapter<T>.notifyAdapter() {  ...  }
    
  • 最后,您还可以使用星形投影,我相信在这种情况下,它会为您提供与第一个解决方案完全相同的结果,因为Adapter类的type参数具有ViewHolder的上限。
    fun RecyclerView.Adapter<*>.notifyAdapter() {  ...  }
    

  • 您可以在官方文档here中详细了解方差和预测。

    10-06 03:24