What is the proper way to create new instance of generic class in kotlin?

前端 未结 2 1169
萌比男神i
萌比男神i 2020-12-09 08:37

I use following initialization:

val entityClass = javaClass>()
var entity = entityClass.newInstance().newInstance()

bu

2条回答
  •  被撕碎了的回忆
    2020-12-09 09:21

    Thanks to Kirill Rakhman I wrote a similar answer (for Android adapter). A difference here is in a parameter of the class.

    private fun  createItem(
        viewGroup: ViewGroup,
        layoutRes: Int,
        method: (View) -> T
    ): T {
        val view = LayoutInflater.from(viewGroup.context).inflate(layoutRes, viewGroup, false)
        return method(view) // Creates T(view).
    }
    

    Then use it this way:

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): AbstractViewHolder {
        return when (viewType) {
            LOADER -> createItem(viewGroup, R.layout.row_loader, ::LoaderViewHolder)
            DATE -> createItem(viewGroup, R.layout.row_date, ::DateViewHolder)
            else -> throw IllegalStateException("Wrong class")
        }
    }
    

    Here LoaderViewHolder and DateViewHolder are descendants of AbstractViewHolder.

提交回复
热议问题