Дженерики для RecyclerView.Adapter Android

Я пытаюсь использовать общую функцию расширения для всех RecyclerView.Adapter в моем приложении, поэтому я создал ext fun, называемый 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) { } } 

Как создать общую функцию расширения для всех RecyclerView.Adapter с использованием Generics.

Заранее спасибо.

    Есть несколько способов сделать это.

    1. Вы можете пометить параметр ViewHolder с помощью дисперсии. Таким образом, ваша функция не является общей, поэтому у вас не будет доступа к точному типу ViewHolder .

       fun RecyclerView.Adapter<out RecyclerView.ViewHolder>.notifyAdapter() { ... } 
    2. Кроме того, у вас может быть параметр общего типа для функции, которая должна быть подклассом ViewHolder . Таким образом, вы можете использовать T внутри функции, например, вы могли бы создать listOf<T>() если хотите.

       fun <T : RecyclerView.ViewHolder> RecyclerView.Adapter<T>.notifyAdapter() { ... } 
    3. Наконец, вы также можете использовать звездную проекцию, которая, как я полагаю, в этом случае даст вам тот же результат, что и первое решение, поскольку аргумент типа класса Adapter имеет верхнюю границу ViewHolder .

       fun RecyclerView.Adapter<*>.notifyAdapter() { ... } 

    Здесь вы можете более подробно ознакомиться с отклонением и прогнозами в официальной документации.