web-dev-qa-db-ja.com

Kotlin抽象ジェネリックビューホルダーのクラスに1つの型引数が必要です

私は次のように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>() {

「クラスに1つの型引数が必要です」コンパイルエラーが発生します。

RecyclerView.Adapter<BaseSettingsViewHolder>

ヘルプに感謝します!

19
Udi Oshi

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-その記事を読む=> "Kotlinのジェネリック" ;)

31
Kaloglu

RecyclerView.Adapter<BaseSettingsViewHolder>型のBaseSettingsViewHolderの型引数を指定する必要があります。

Javaとは異なり、Kotlinには生の型がないため、型引数を単純に省略することはできません。

生の型に最も近い概念は star-projected typesBaseSettingsViewHolder<*>RecyclerView.Adapter<BaseSettingsViewHolder<*>>を使用します。これはBaseSettingsViewHolderの型引数が不明であることを意味します。

1
hotkey