android - 如何使用 kotlin 在构造函数中创建传递方法引用的泛型类实例

标签 android generics reflection 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>所以你可以简单地做:

entityClass.getConstructor(View::class.java, Function1::class.java)

关于android - 如何使用 kotlin 在构造函数中创建传递方法引用的泛型类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46346189/

相关文章:

java - Android Studio 导入了错误的包

android - 单击关联的 TextView 时如何启用复选框

c# - 通过反射将项目动态添加到 List<T>

引用同一类中的方法时,Java Reflection NoSuchMethodException

android - 改造默认线程

Android 在添加 spinnerSelector 时出错,找不到资源标识符

c# - 从枚举中获取值到通用列表中

c# - 为什么 c# 编译器在使用具有 new() 约束的泛型类型调用 new 时发出 Activator.CreateInstance?

reflection - 在 Dart 中动态获取对象的字段

c# - 在 C# 中转换为未知类型反射