I use following initialization:

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

but it's wrong and causes IllegalAccessException on java.lang.Class.newInstance(Class.java:1208)

推荐答案

如果让IntelliJ添加显式类型信息,您会看到entityClass实际上是Class<Class<String>>类型.我不确定这是不是你想要的.在第2行中,首先创建Class<T>的一个实例,然后创建T的一个实例,但无论如何这都是不可能的,因为关于T的一般信息在运行时丢失了.除此之外,您不能直接实例化类对象.

解决方案

一种可能的解决方案是将类型为Class<T>的参数添加到函数或类中,并使用它实例化如下所示的对象.

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

fun test() {
    foo(Object::class.java)
}

但实际上有一个不使用反射的更好的解决方案.定义方法类型() -> T的参数并使用构造函数引用.Here's my related question关于构造函数引用,下面是代码:

fun <T> foo2(factory: () -> T) {
    var entity: T = factory()
}

fun test() {
    foo2(::Object)
}

Kotlin相关问答推荐

Kotlin-删除按钮周围的空格

映射中列表类型的Kotlin可空接收器?

在Kotlin中的嵌套when语句中,else块是强制性的吗?

collectAsState 未从存储库接收更改

有没有办法在 jetpack compose 中将 TextField 密码点图标增加得更大?

同时也是一个字符串的 Kotlin 枚举

将 Integer 转换为 Unit 编译成功

AIDL 中的 Parcelize 注释:Incompatible types: Object cannot be converted to MyCustomObject

Kotlin 方法重载

`this@classname` 在 Kotlin 中是什么意思?

Kotlin - mutableMapOf() 会保留我输入的顺序

TextField maxLength - Android Jetpack Compose

requireNotNull vs sure !! 操作符

空对象引用上的 TransitionSet ArrayList.size()

在Kotlin中将列表转换为对的惯用方法

将字符串编码为Kotlin中的UTF-8

如何计算Kotlin中的百分比

使用 java lambda 调用 kotlin 函数时,Kotlin 无法访问 kotlin.jvm.functions.Function1

Kotlin中对象和数据类的区别是什么?

具有多个 parameter的 Kotlin 枚举