web-dev-qa-db-fra.com

Kotlin Un argument de type attendu pour la classe du détenteur de la vue générique abstraite

J'essaie de créer un RecyclerView.Adapter avec les éléments suivants:


Porte-vues - Fourni le parent abstrait et un fils

abstract class BaseSettingsViewHolder<T>(var viewDataBinding : 
ViewDataBinding) : RecyclerView.ViewHolder(viewDataBinding.root) {

   abstract fun onBind(data: T, presenter: ISettingsPresenter, position: Int)
}

class SettingsTitleViewHolder(viewDataBinding: ViewDataBinding) : BaseSettingsViewHolder<TitleData>(viewDataBinding) {

    override fun onBind(data: TitleData, presenter: ISettingsPresenter, position: Int) {
        viewDataBinding.setVariable(BR.titleData, data)
        viewDataBinding.setVariable(BR.itemPosition, position)
        viewDataBinding.setVariable(BR.settingsPresenter, presenter)
        viewDataBinding.executePendingBindings()
    }

}

Et lorsque vous essayez de déclarer l'adaptateur:

class SettingsAdapter(var context: Context, var presenter: ISettingsPresenter) : RecyclerView.Adapter<BaseSettingsViewHolder>() {

Je reçois une erreur de compilation "Un argument de type attendu pour la classe" sur:

RecyclerView.Adapter<BaseSettingsViewHolder>

Appréciez l'aide!

19
Udi Oshi

1- Si vous utilisez toujours SettingTitleViewHolder ;

RecyclerView.Adapter<SettingTitleViewHolder>

2- Si vous souhaitez utiliser n'importe quelle classe qui a étendu BaseSettingViewHolder ;

RecyclerView.Adapter<BaseSettingsViewHolder<*>>

3- Utiliser Tout type d'objet

RecyclerView.Adapter<BaseSettingsViewHolder<Any>>

4- Utiliser le paramètre de type étendu pour la classe d'adaptateur

class SettingsMenuAdapter<T:BaseSettingViewHolder<*>>:RecyclerView.Adapter<T>

5- Définissez le paramètre de type de classe abstraite.

abstract class BaseSettingsViewHolder<out T>
RecyclerView.Adapter<BaseSettingsViewHolder<Any>>

7- Lisez cet article => "Generics in Kotlin" ;)

31
Kaloglu

Vous devez spécifier l'argument type pour le BaseSettingsViewHolder dans le RecyclerView.Adapter<BaseSettingsViewHolder> type.

Kotlin, contrairement à Java, n'a pas les types bruts, vous ne pouvez donc pas simplement omettre les arguments de type.

Le concept le plus proche des types bruts est types projetés en étoile : utilisez BaseSettingsViewHolder<*> dans RecyclerView.Adapter<BaseSettingsViewHolder<*>>, cela signifie que l'argument type pour BaseSettingsViewHolder est inconnu.

1
hotkey