我使用以下初始化:
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)
}