如何使用kotlin创建在构造函数中传递方法引用的泛型类的实例
现在,我正在使用kotlin作为我的主要编程语言,我正试图简化Android的Recyclerview实现逻辑,我被困在以下几点:
比方说,我已经定义了下面的ViewHolder类,通过构造函数中的方法引用传播点击位置事件。
class CustomViewHolder(itemView: View, val onClick: (Int) -> Unit)) : RecyclerView.ViewHolder(itemView){ itemView.setOnClickListener { onClick.invoke(adapterPosition) } }
我怎样才能构建一个在构造函数中有一个方法引用的泛型类的实例?
我的recyclerview实现在构造函数中有一个泛型类,也是一个实体引用,可以通过在onCreateViewHolder上的反射来创建我的CustomViewHolder类的实例:
class CustomAdapter<HolderClassGeneric>(val entityClass: Class<HolderClassGeneric>) : RecyclerView.Adapter<HolderClassGeneric>() { /* Usual recyclerview stuff */ //Method that I want to be called when a list item is clicked fun onListItemClicked(position: Int) { //do stuff } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HolderClassGeneric { val view = LayoutInflater.from(parent.context).inflate(listItemLayoutResourceId, parent, false) val constructor: Constructor<HolderClassGeneric> val instance: HolderClassGeneric //I'M STUCK HERE constructor = entityClass.getConstructor(View::class.java, ?¿?¿?¿?¿) instance = constructor.newInstance(view, this::onListItemClicked) return instance }
如果我想要实现的是不可能的,是否有可能通过反射来使用setter来传递方法引用?
一个Kotlin lambda通常被翻译成一个FunctionX对象,它是X的参数个数,所以如果你正在寻找一个lambda函数的表示形式,比如(Int) -> Unit
就是Function1<Int, Unit>
so你可以简单地做:
entityClass.getConstructor(View::class.java, Function1::class.java)
您可以使用像工厂一样的参数功能。
class CustomAdapter<HolderClassGeneric>(val entityFactory: (View, (Int) -> Unit) -> HolderClassGeneric) : RecyclerView.Adapter<HolderClassGeneric>() { /* Usual recyclerview stuff */ //Method that I want to be called when a list item is clicked fun onListItemClicked(position: Int) { //do stuff } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HolderClassGeneric { val view = LayoutInflater.from(parent.context).inflate(listItemLayoutResourceId, parent, false) val instance = entityFactory(view, this::onListItemClicked) return instance }