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

我使用以下初始化:

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

但它是错误的,并导致java.lang.Class.newInstance(Class.java:1208) IllegalAccessException

如果让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) } 

但是,实际上,没有反射的情况下,会有更优雅的解决方案。 定义方法type () -> T的参数并使用构造函数引用。 这里是关于构造函数引用的相关问题,下面是代码:

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