Class 在kotlin中创建泛型类的新实例的正确方法是什么?
我使用以下初始化:Class 在kotlin中创建泛型类的新实例的正确方法是什么?,class,generics,kotlin,Class,Generics,Kotlin,我使用以下初始化: val entityClass = javaClass<Class<T>>() var entity = entityClass.newInstance().newInstance() val entityClass=javaClass() var entity=entityClass.newInstance().newInstance() 但是它是错误的,并导致java.lang.Class.newInstance(Class.java:1208
val entityClass = javaClass<Class<T>>()
var entity = entityClass.newInstance().newInstance()
val entityClass=javaClass()
var entity=entityClass.newInstance().newInstance()
但是它是错误的,并导致
java.lang.Class.newInstance(Class.java:1208)
上的IllegalAccessException
,如果让IntelliJ添加显式类型信息,您会看到entityClass
实际上是Class
类型。我不确定这是否是你想要的。在第2行中,您首先创建Class
的一个实例,然后创建T
的一个实例,但无论如何这是不可能的,因为有关T
的一般信息在运行时丢失。除此之外,您不能直接实例化类对象
解决方案
一种可能的解决方案是向函数或类中添加一个Class
类型的参数,并使用它来实例化这样的对象
fun <T> foo(entityClass: Class<T>) {
var entity: T = entityClass.newInstance()
}
fun test() {
foo(Object::class.java)
}
多亏了,我写了一个类似的答案(针对Android适配器)。这里的区别在于类的一个参数
private fun <T> createItem(
viewGroup: ViewGroup,
layoutRes: Int,
method: (View) -> T
): T {
val view = LayoutInflater.from(viewGroup.context).inflate(layoutRes, viewGroup, false)
return method(view) // Creates T(view).
}
这里的
LoaderViewHolder
和DateViewHolder
是AbstractViewHolder
的后代您好,如果entityClass是Interface呢?有没有办法在泛型类型上设置一个表示“非接口”的绑定?C#具有类似行为的new
关键字,即“T必须是可构造的”。我猜您可以通过将函数内联到具体化来省略entityClass
。在foo函数中创建时,如何将属性添加到对象中?
private fun <T> createItem(
viewGroup: ViewGroup,
layoutRes: Int,
method: (View) -> T
): T {
val view = LayoutInflater.from(viewGroup.context).inflate(layoutRes, viewGroup, false)
return method(view) // Creates T(view).
}
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): AbstractViewHolder {
return when (viewType) {
LOADER -> createItem(viewGroup, R.layout.row_loader, ::LoaderViewHolder)
DATE -> createItem(viewGroup, R.layout.row_date, ::DateViewHolder)
else -> throw IllegalStateException("Wrong class")
}
}