¿Cuál es la forma correcta de crear una nueva instancia de class genérica en kotlin?

Yo uso la siguiente initialization:

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

pero está mal y causa IllegalAccessException en java.lang.Class.newInstance(Class.java:1208)

Si permite que IntelliJ agregue información de tipo explícito, verá que entityClass es en realidad del tipo Class<Class<String>> . No estoy seguro si eso es lo que quieres. En la línea 2, primero está creando una instancia de Class<T> y luego una de T pero eso no es posible de todos modos, porque la información genérica sobre T se pierde en el time de ejecución. Aparte de eso, no puedes instanciar objects de class directamente.

Solución

Una posible solución sería agregar un parámetro de tipo Class<T> a su function o class y usarlo para instanciar objects como este.

 fun <T> foo(entityClass: Class<T>) { var entity: T = entityClass.newInstance() } fun test() { foo(Object::class.java) } 

Pero en realidad hay una solución más elegante sin el uso de la reflexión. Defina un parámetro de tipo de método () -> T y use references de constructor. Aquí está mi pregunta relacionada sobre references de constructores y aquí está el código:

 fun <T> foo2(factory: () -> T) { var entity: T = factory() } fun test() { foo2(::Object) } 
  • Kotlin nombró la syntax del parámetro para el cierre / lambda
  • Kotlin comstackndo desde línea de command
  • Código de reference de data binding de Android Studio 3.0 no generado por android studio
  • No se puede ejecutar el file jar. (Error: no se pudo encontrar o cargar la class principal co.pissarra.Mainkt)
  • Funciones elementales en kotlin
  • "No se pudo iniciar la actividad" en una testing de café expreso
  • Devolución de llamada al constructor con múltiples parameters
  • Objetos Kotlin vs compañero-object vs methods con ámbito de package
  • Borre pasos para importar una biblioteca C nativa en Kotlin usando CLion
  • ¿Problema de Android en la selección y deselección de elementos en un adaptador kotlin?
  • Hello World en KotlinJS falla con Kotlin no está definido