Class 在kotlin中创建泛型类的新实例的正确方法是什么?

Class 在kotlin中创建泛型类的新实例的正确方法是什么?,class,generics,kotlin,Class,Generics,Kotlin,我使用以下初始化: val entityClass = javaClass<Class<T>>() var entity = entityClass.newInstance().newInstance() val entityClass=javaClass() var entity=entityClass.newInstance().newInstance() 但是它是错误的,并导致java.lang.Class.newInstance(Class.java:1208

我使用以下初始化:

val entityClass = javaClass<Class<T>>()
var entity = entityClass.newInstance().newInstance()
val entityClass=javaClass()
var entity=entityClass.newInstance().newInstance()

但是它是错误的,并导致
java.lang.Class.newInstance(Class.java:1208)
上的
IllegalAccessException
,如果让IntelliJ添加显式类型信息,您会看到
entityClass
实际上是
Class
类型。我不确定这是否是你想要的。在第2行中,您首先创建
Class
的一个实例,然后创建
T
的一个实例,但无论如何这是不可能的,因为有关
T
的一般信息在运行时丢失。除此之外,您不能直接实例化类对象

解决方案 一种可能的解决方案是向函数或类中添加一个
Class
类型的参数,并使用它来实例化这样的对象

fun <T> foo(entityClass: Class<T>) {
    var entity: T = entityClass.newInstance()
}

fun test() {
    foo(Object::class.java)
}
多亏了,我写了一个类似的答案(针对Android适配器)。这里的区别在于类的一个参数

private fun <T> 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).
}

这里的
LoaderViewHolder
DateViewHolder
AbstractViewHolder

的后代您好,如果entityClass是Interface呢?有没有办法在泛型类型上设置一个表示“非接口”的绑定?C#具有类似行为的
new
关键字,即“T必须是可构造的”。我猜您可以通过将函数内联到具体化来省略
entityClass
。在foo函数中创建时,如何将属性添加到对象中?
private fun <T> 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).
}
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")
    }
}