Android 如何在Kotlin中创建具体化类型的对象
我试图创建一个扩展函数来为recycler视图适配器创建视图持有者对象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) /
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))中获益匪浅。你也可以使用:
(函数引用)引用构造函数?我不知道,酷!