Как создать экземпляр универсального класса, передающего ссылку метода в конструкторе с kotlin

Теперь, когда я использую kotlin в качестве основного языка программирования, я пытаюсь упростить логику реализации Recyclerview Android, и я застрял в следующем пункте:

Предположим, что я определил следующий класс ViewHolder, где событие позиции клика распространяется через ссылку метода в конструкторе.

class CustomViewHolder(itemView: View, val onClick: (Int) -> Unit)) : RecyclerView.ViewHolder(itemView){ itemView.setOnClickListener { onClick.invoke(adapterPosition) } } 

Как я могу создать экземпляр универсального класса с ссылкой на метод в конструкторе?

Реализация recyclerview имеет общий класс в конструкторе, а также ссылку на сущность, чтобы иметь возможность создать экземпляр класса CustomViewHolder путем отражения в onCreateViewHolder:

 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 } 

Если то, чего я хочу достичь, невозможно, можно ли передать ссылку метода с помощью сеттера путем отражения?

Лоток Kotlin обычно переводится как объект FunctionX, являющийся X числом параметров, которые он имеет, поэтому, если вы ищете представление лямбда-функции типа (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 }