Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在Kotlin中创建具体化类型的对象_Android_Kotlin_Android Recyclerview_Kotlin Extension_Kotlin Reified Type Parameters - Fatal编程技术网

Android 如何在Kotlin中创建具体化类型的对象

Android 如何在Kotlin中创建具体化类型的对象,android,kotlin,android-recyclerview,kotlin-extension,kotlin-reified-type-parameters,Android,Kotlin,Android Recyclerview,Kotlin Extension,Kotlin Reified Type Parameters,我试图创建一个扩展函数来为recycler视图适配器创建视图持有者对象 inline fun <reified T: RecyclerView.ViewHolder> ViewGroup.createViewHolder(@LayoutRes res: Int): T { val inflater = LayoutInflater.from(context) val itemView = inflater.inflate(res, this, false) /

我试图创建一个扩展函数来为recycler视图适配器创建视图持有者对象

inline fun <reified T: RecyclerView.ViewHolder> ViewGroup.createViewHolder(@LayoutRes res: Int): T {
    val inflater = LayoutInflater.from(context)
    val itemView = inflater.inflate(res, this, false)
    // return ViewHolder Object
}
inline-fun-ViewGroup.createViewHolder(@LayoutRes-res:Int):T{
val inflater=LayoutInflater.from(上下文)
val itemView=充气机。充气(res,this,false)
//返回ViewHolder对象
}

如何创建扩展RecyclerView.ViewHolder的T类型对象,以便从函数返回。

此解决方案非常难看,但我假设“理论上”可以工作:

inline fun <reified T: RecyclerView.ViewHolder> ViewGroup.create(@LayoutRes res: Int): T {
        val inflater = LayoutInflater.from(context)
        val itemView = inflater.inflate(res, this, false)
        return T::class.java.getConstructor(View::class.java).newInstance(itemView)
    }

一个干净的替代解决方案是显式地传递构造函数。它甚至不会更详细,因为类型参数可以推断,不需要再指定了。这样使用:

val viewHolder = my_view_group.create(::MyViewHolder, R.layout.my_layout)
inline fun <reified T: RecyclerView.ViewHolder> ViewGroup.create(createHolder: (View) -> T, @LayoutRes res: Int): T {
    val inflater = LayoutInflater.from(context)
    val itemView = inflater.inflate(res, this, false)
    return createHolder(itemView)
}
这样实施:

val viewHolder = my_view_group.create(::MyViewHolder, R.layout.my_layout)
inline fun <reified T: RecyclerView.ViewHolder> ViewGroup.create(createHolder: (View) -> T, @LayoutRes res: Int): T {
    val inflater = LayoutInflater.from(context)
    val itemView = inflater.inflate(res, this, false)
    return createHolder(itemView)
}
inlinefunviewgroup.create(createHolder:(View)->T,@LayoutRes res:Int):T{
val inflater=LayoutInflater.from(上下文)
val itemView=充气机。充气(res,this,false)
返回createHolder(itemView)
}

不是对前面提到的问题的回答,但对于那些来到这里想要摆脱
东西(Foo::class.java,…)
并使用
东西(…)
的人来说应该是有帮助的

您只需在
伴生对象中添加一个具体化的
调用

之前

class Thing<E : Enum<E>>(cls: Class<E>, value: String? = null) : Iterable<E> {
    ...
}

val thing = Thing(Foo::class.java, ...)
类事物(cls:class,value:String?=null):Iterable{
...
}
val thing=thing(Foo::class.java,…)
之后

class Thing<E : Enum<E>>(cls: Class<E>, value: String? = null) : Iterable<E> {
    ...
    companion object {
        // Lets us construct using Thing<Foo>(...) instead of Thing(Foo::class.java, ...)
        inline operator fun <reified T : Enum<T>> invoke(value: String? = null) = Thing(T::class.java, value)
    }
}

val thing = Thing<Foo>(...)
类事物(cls:class,value:String?=null):Iterable{
...
伴星{
//让我们使用Thing(…)而不是Thing(Foo::class.java,…)来构造
内联运算符fun invoke(值:String?=null)=Thing(T::class.java,value)
}
}
val thing=thing(…)

我知道这是可能的解决方案,但想知道这是创建ViewHolder的好方法吗?反思是一件好事吗?嗯,反思从来都不是真正的好事。在这里,可能会发生很多事情,例如更新ViewHolder的创建方式(例如,不使用视图作为参数)。我不相信你会从调用这个而不是简单的MyViewHolder(LayoutInflater.from(parent.context)。充气(R.layout.my_layout,parent,false))中获益匪浅。你也可以使用
(函数引用)引用构造函数?我不知道,酷!