Я пытаюсь создать RecyclerView.Adapter со следующим:
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() }
}
И при попытке объявить адаптер:
class SettingsAdapter(var context: Context, var presenter: ISettingsPresenter) : RecyclerView.Adapter<BaseSettingsViewHolder>() {
Я получаю «Один аргумент типа, ожидаемый для класса», компилирую ошибку:
RecyclerView.Adapter<BaseSettingsViewHolder>
Цените помощь!
Вы должны указать аргумент типа для BaseSettingsViewHolder
в BaseSettingsViewHolder
RecyclerView.Adapter<BaseSettingsViewHolder>
.
Kotlin, в отличие от Java, не имеет сырых типов, поэтому вы не можете просто опустить аргументы типа.
Ближайшая концепция для типов raw – это звездообразные типы : используйте BaseSettingsViewHolder<*>
в RecyclerView.Adapter<BaseSettingsViewHolder<*>>
, это будет означать, что аргумент типа для BaseSettingsViewHolder
неизвестен.
1- Если вы всегда используете SettingTitleViewHolder ;
RecyclerView.Adapter<SettingTitleViewHolder>
2- Если вы хотите использовать любой класс, который расширил BaseSettingViewHolder ;
RecyclerView.Adapter<BaseSettingsViewHolder<*>>
3- Использовать любой тип объекта
RecyclerView.Adapter<BaseSettingsViewHolder<Any>>
4- Использовать параметр расширенного типа для класса адаптера
class SettingsMenuAdapter<T:BaseSettingViewHolder<*>>:RecyclerView.Adapter<T>
5- Определите параметр абстрактного типа класса.
abstract class BaseSettingsViewHolder<out T> RecyclerView.Adapter<BaseSettingsViewHolder<Any>>
7- Читайте эту статью => «Дженерики в Котлине» 😉