Class Kotlin泛型类

Class Kotlin泛型类,class,generics,kotlin,Class,Generics,Kotlin,我是Kotlin的新手,正在尝试访问泛型类中的特定字段 我尝试过各种可能的解决方案——我遇到的问题是,我不知道如何通知Kotlin我传递的类中存在字段名 这是我的班级:- @Entity(tableName = "coursemark_table") @Parcelize class CourseMark( @field:PrimaryKey @field:ColumnInfo(name = "coursemark_number") var number: Int,

我是Kotlin的新手,正在尝试访问泛型类中的特定字段

我尝试过各种可能的解决方案——我遇到的问题是,我不知道如何通知Kotlin我传递的类中存在字段名

这是我的班级:-

@Entity(tableName = "coursemark_table")
@Parcelize
class CourseMark(
    @field:PrimaryKey
    @field:ColumnInfo(name = "coursemark_number")
    var number: Int,
    var name: String,
    var latitude: String,
    var longitude: String,
    var passTo: String
): Parcelable
这是我试图初始化的通用列表适配器类-我不知道如何在OnBindViewHolder函数中找到CourseMark中的name字段,我可以理解为什么BaseListHolder在初始化之前不知道CourseMark中的字段名,但必须有一种方法告诉Kotlin编译器这一点字段存在-我很抱歉发布此消息,但我已经挣扎了好几天才能弄清楚这一点:-

abstract class BaseListAdapter<T> internal constructor(context: Context) :
    RecyclerView.Adapter<BaseListAdapter<T>.BaseViewHolder>() {

    private val mInflater: LayoutInflater = LayoutInflater.from(context)
    private var mMarks = emptyList<T>() // Cached copy of marks

    inner class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val markItemView: TextView = itemView.findViewById(R.id.textView)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
        val itemView = mInflater.inflate(R.layout.recyclerview_coursemark, parent, false)
        return BaseViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
        val current = mMarks[position]
        holder.markItemView.text = current.name
    }

    /**
     * Associate a list of marks with this adapter
     */

    internal fun setMarks(marks: List<T>) {
        mMarks = marks
        notifyDataSetChanged()
    }

    // getItemCount() is called many times, and when it is first called,
    // mMarks has not been updated (means initially, it's null, and we can't return null).
    override fun getItemCount(): Int {
        return mMarks.size
    }

    /**
     * Get the mark at a given position.
     * This method is useful for identifying which mark
     * was clicked or swiped in methods that handle user events.
     *
     * @param position
     * @return The mark at the given position
     */
    fun getMarkAtPosition(position: Int): T {
        return mMarks[position]
    }

}

最好是使用指定的类型CourseMark实现RecyclerView.Adapter。我不清楚为什么你要保持你的适配器通用,当你膨胀一个布局,看起来它是特定于类CourseMark

但是,如果您确实希望保持这种通用性,可以在onBindViewHolder方法中利用Kotlin的智能转换:


埃利-非常感谢你这么做-你可以看到,我对科特林很陌生,我会接受你的评论。太好了。如果这解决了你的问题,别忘了投票并接受答案!
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
    val current = mMarks[position]
    if(current is CourseMark){
         holder.markItemView.text = current.name
    }
}