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