J'essaie de créer un RecyclerView.Adapter avec les éléments suivants:
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!
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" ;)
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.