AndroidKotlin:如何使用泛型创建继承类型的实例?
这是我正在做的事情的简化代码:
我有这个习俗ViewHolder:
open class AsyncViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
....
}
我从上面继承ViewHolder,后来需要创建一个AsyncCellAdapter继承类型。我正在使用泛型这样做:
abstract class AsyncCellAdapter<T: AsyncCellAdapter.AsyncViewHolder>() : RecyclerView.Adapter<T>(){
....
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T {
val viewHolder = T(View(parent.context)) //<----------Here's the problem
....
return viewHolder
}
....
}
问题出现在Tin the lineT(View(parent.context))
它给了我错误:
Type parameter T cannot be called as function
如何使用泛型创建继承类型的实例并返回它?
回答
由于类型擦除,您不能在不将具体类传递给构造函数的情况下执行此操作。或者,为了避免必须使用反射来查找和调用构造函数,为构造函数提供一个用于构造 ViewHolder 的函数参数会更清晰,因此您可以只传递一个构造函数引用。
例子:
abstract class AsyncCellAdapter<T: AsyncCellAdapter.AsyncViewHolder>(
private val viewHolderConstructor: (View)->T
): RecyclerView.Adapter<T>(){
//...
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T {
val viewHolder = viewHolderConstructor(View(parent.context))
//...
return viewHolder
}
//...
}
// Example subclass:
class MyAdapter: AsyncCellAdapter<MyAdapter.MyViewHolder>(::MyViewHolder) {
class MyViewHolder(itemView: View): AsyncCellAdapter.AsyncViewHolder(itemView)
}