私は次のように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>
ヘルプに感謝します!
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のジェネリック" ;)
RecyclerView.Adapter<BaseSettingsViewHolder>
型のBaseSettingsViewHolder
の型引数を指定する必要があります。
Javaとは異なり、Kotlinには生の型がないため、型引数を単純に省略することはできません。
生の型に最も近い概念は star-projected types :BaseSettingsViewHolder<*>
でRecyclerView.Adapter<BaseSettingsViewHolder<*>>
を使用します。これはBaseSettingsViewHolder
の型引数が不明であることを意味します。