抽象通用视图持有者的类预期的 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&lt;BaseSettingsViewHolder&gt; 类型中为BaseSettingsViewHolder 指定类型参数。

与 Java 不同,Kotlin 没有原始类型,因此您不能简单地省略类型参数。

最接近原始类型的概念是star-projected types:在RecyclerView.Adapter&lt;BaseSettingsViewHolder&lt;*&gt;&gt; 中使用BaseSettingsViewHolder&lt;*&gt;,这意味着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&lt;BaseSettingsViewHolder&lt;SomeType&gt;&gt;

以上是关于抽象通用视图持有者的类预期的 Kotlin 一种类型参数的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin入门(23)适配器的进阶表达

kotlin抽象类密封类接口

在 Recyclerview Kotlin 中使用多布局绑定的正确方法

Kotlin基础(十五) 关键字:openfinal和abstract(抽象类)

Kotlin——最详细的抽象类(abstract)内部类(嵌套类)详解

自动布局无法按预期工作