【问题标题】:Android Kotlin: How do I create an instance of the inherited type using Generics?Android Kotlin:如何使用泛型创建继承类型的实例?
【发布时间】:2021-06-13 01:37:56
【问题描述】:

这是我正在做的简化代码:

我有这个自定义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
    }

    ....
}

问题出现在T(View(parent.context)) 行中的T

它给了我错误:

Type parameter T cannot be called as function

如何使用泛型创建继承类型的实例并返回它?

【问题讨论】:

    标签: java android kotlin generics


    【解决方案1】:

    由于type erasure,如果不将具体类传递给构造函数,您将无法执行此操作。或者,为了避免必须使用反射来查找和调用构造函数,给构造函数一个用于构造 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)
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多