抽象通用视图持有者的类预期的 Kotlin 一种类型参数
Posted
技术标签:
【中文标题】抽象通用视图持有者的类预期的 Kotlin 一种类型参数【英文标题】:Kotlin One type argument expected for class for abstract generic view holder 【发布时间】:2018-06-11 13:57:57 【问题描述】:我正在尝试使用以下内容创建 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>
感谢您的帮助!
【问题讨论】:
【参考方案1】:1- 如果你总是使用 SettingTitleViewHolder;
RecyclerView.Adapter<SettingTitleViewHolder>
2- 如果你想使用任何扩展BaseSettingViewHolder的类;
RecyclerView.Adapter<BaseSettingsViewHolder<*>>
3- 使用任何对象类型
RecyclerView.Adapter<BaseSettingsViewHolder<Any>>
4- 对适配器类使用扩展类型参数
class SettingsMenuAdapter<T>:RecyclerView.Adapter<T> where : BaseSettingViewHolder<*>
5- 定义抽象类类型参数。
abstract class BaseSettingsViewHolder<out T> RecyclerView.Adapter<BaseSettingsViewHolder<Any>>
7- 阅读那篇文章 => "Generics in Kotlin" ;)
【讨论】:
您必须从 RecyclerView 适配器 ViewHolder 扩展 TitleData。【参考方案2】:您应该在RecyclerView.Adapter<BaseSettingsViewHolder>
类型中为BaseSettingsViewHolder
指定类型参数。
与 Java 不同,Kotlin 没有原始类型,因此您不能简单地省略类型参数。
最接近原始类型的概念是star-projected types:在RecyclerView.Adapter<BaseSettingsViewHolder<*>>
中使用BaseSettingsViewHolder<*>
,这意味着BaseSettingsViewHolder
的类型参数是未知的。
【讨论】:
感谢您的快速回答,但我已经尝试过了,但在 onBindViewHolder 中调用 holder.onBind(dataList[position], presenter, position) 时出现错误。我得到了 Out-projected type 'BaseSettingsViewHolder' 禁止使用'public abstract fun onBind(data: T, presenter: ISettingsPresenter, position: Int): Unit defined in BaseSettingsViewHolder' 你能提供一些具体的类型吗?RecyclerView.Adapter<BaseSettingsViewHolder<SomeType>>
以上是关于抽象通用视图持有者的类预期的 Kotlin 一种类型参数的主要内容,如果未能解决你的问题,请参考以下文章
在 Recyclerview Kotlin 中使用多布局绑定的正确方法
Kotlin基础(十五) 关键字:openfinal和abstract(抽象类)