在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) }