Каков правильный способ создания нового экземпляра родового класса в котлин?

Я использую следующую инициализацию:

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

Но на самом деле существует более элегантное решение без использования рефлексии. Определите параметр метода type () -> T и используйте ссылки на конструкторы. Вот мой вопрос о ссылках на конструктор и вот код:

 fun <T> foo2(factory: () -> T) { var entity: T = factory() } fun test() { foo2(::Object) }