Intereting Posts
Компонент Kotlin для назначения параметра метода полю в Android Studio Свойства делегата Kotlin, реализующие функцию оператора «предоставлятьDelegate», но метод никогда не вызывал Kotlin – Прерывистая ошибка «плохого файла класса» Как распространять аргументы по умолчанию между функциями в Kotlin? Класс тестирования детей Kotlin запускает все родительские тесты Как исправить инициализацию поля val с помощью прокси-сервера Spring Security? Как получить объявленные функции класса Kotlin (KClass в M12)? Android: соскабливание статей с помощью jsoup Как оценивать программу Котлин? Как я могу запустить Kotlin REPL kotlinc-jvm или kotlinc Проблема с инъекцией Kotlin + Dagger в зависимости от Android версии Android / SDK (?) Преобразование Java Collection.toArray в kotlin Kotlin: isAssignableFrom и проверки типа отражения Использование Kotlin в библиотеке Android, распространяемой как AAR Ошибка сборки после обновления до Android Studio 3.0 с помощью Kotlin

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

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

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