Kotlin一个类型参数,用于抽象通用视图持有者的类

Udi*_*shi 21 android kotlin android-recyclerview

我正在尝试使用以下内容创建RecyclerView.Adapter:


查看持有人 - 提供抽象父母和一个儿子

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

   abstract fun onBind(data: T, presenter: ISettingsPresenter, position: Int)
}
Run Code Online (Sandbox Code Playgroud)
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()
    }

}
Run Code Online (Sandbox Code Playgroud)

并在尝试声明适配器时:

class SettingsAdapter(var context: Context, var presenter: ISettingsPresenter) : RecyclerView.Adapter<BaseSettingsViewHolder>() {
Run Code Online (Sandbox Code Playgroud)

我得到了"期望类的一个类型参数"编译错误:

RecyclerView.Adapter<BaseSettingsViewHolder>
Run Code Online (Sandbox Code Playgroud)

感谢帮助!

Kal*_*glu 35

1-如果你总是使用SettingTitleViewHolder ;

RecyclerView.Adapter<SettingTitleViewHolder>
Run Code Online (Sandbox Code Playgroud)

2-如果要使用扩展BaseSettingViewHolder的任何类;

RecyclerView.Adapter<BaseSettingsViewHolder<*>>
Run Code Online (Sandbox Code Playgroud)

3-使用任何对象类型

RecyclerView.Adapter<BaseSettingsViewHolder<Any>>
Run Code Online (Sandbox Code Playgroud)

4-对适配器类使用扩展类型参数

class SettingsMenuAdapter<T:BaseSettingViewHolder<*>>:RecyclerView.Adapter<T>
Run Code Online (Sandbox Code Playgroud)

5-定义抽象类类型参数.

abstract class BaseSettingsViewHolder<out T>
RecyclerView.Adapter<BaseSettingsViewHolder<Any>>
Run Code Online (Sandbox Code Playgroud)

7-阅读那篇文章=> "Kotlin中的仿制药" ;)