Kotlin 从泛型参数创建实例

Kotlin 从泛型参数创建实例,kotlin,Kotlin,我想重构以下代码,以便可以将其与不同的ViewHolder类型一起重用: class TestsAdapter( private val clickListener: ClickListener ) : PagedListAdapter<RecyclerViewTestInfo, TestsViewHolder>(diffCallback) { override fun getItemCount(): Int { return super.getIt

我想重构以下代码,以便可以将其与不同的ViewHolder类型一起重用:

class TestsAdapter(
    private val clickListener: ClickListener
) : PagedListAdapter<RecyclerViewTestInfo, TestsViewHolder>(diffCallback) {

    override fun getItemCount(): Int {
        return super.getItemCount()
    }

    override fun onBindViewHolder(holder: TestsViewHolder, position: Int) {
        val testInfo = getItem(position) as RecyclerViewTestInfo

        with(holder) {
            bindTo(testInfo)
            testInfo.let {
                itemView.setOnClickListener {
                    clickListener(testInfo)
                }
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestsViewHolder =
        TestsViewHolder(parent)
}
类TestsAdapter(
私有val clickListener:clickListener
):PagedListAdapter(diffCallback){
重写getItemCount():Int{
返回super.getItemCount()
}
覆盖BindViewHolder(holder:TestsViewHolder,位置:Int){
val testInfo=getItem(位置)作为RecycleServiceWTestInfo
带(支架){
bindTo(testInfo)
testInfo.let{
itemView.setOnClickListener{
clickListener(testInfo)
}
}
}
}
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):TestsViewHolder=
TestsViewHolder(父级)
}

我不清楚如何处理泛型类型实例的创建。在代码中,onCreateViewHolder使用特定的ViewHolder进行初始化。如何使用泛型实现这一点?

您在这里面临的问题是,您无法直接从泛型类型初始化实例,您需要至少有一个
对象。有一个解决方案,但我不建议使用它,因为它增加了一层不希望的复杂性

将类类型传递给构造函数:

   class Test<A : DiffUtil.Callback, B : RecyclerView.ViewHolder?>(type: Class<B>): PagedListAdapter<A, B>(diff)
这种解决方案是不可取的,因为没有编译时检查,当有人使用不同的构造函数创建新的ViewHolder时,他将得到一个运行时错误

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): B =
    type.getConstructor(ViewGroup::class.java).newInstance(parent)