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

时间:2018-01-01 16:09:36

标签: android android-recyclerview kotlin

我尝试使用以下内容创建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>() {

我得到&#34;一个类型的参数预期为班级&#34;编译错误:

RecyclerView.Adapter<BaseSettingsViewHolder>

感谢帮助!

2 个答案:

答案 0 :(得分:26)

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-阅读那篇文章=&gt; "Generics in Kotlin";)

答案 1 :(得分:1)

您应该在BaseSettingsViewHolder类型中为RecyclerView.Adapter<BaseSettingsViewHolder>指定类型参数。

与Java不同,Kotlin没有原始类型,所以你不能简单地省略类型参数。

与原始类型最接近的概念是star-projected types:在BaseSettingsViewHolder<*>中使用RecyclerView.Adapter<BaseSettingsViewHolder<*>>,这意味着BaseSettingsViewHolder的类型参数未知。