我使用以下初始化:

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

但这是错误的,并导致IllegalAccessException上的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)
}

10-07 22:38