Intereting Posts
Как использовать Cucumber let Spring для определения уровня экспрессии? Kotlin: какой формат использовать для документации? Как безопасно решить эту нулевую проверку в инициализаторе? kotlin получить представление из заголовка NavigationView Как я могу назвать метод в Котлин с другой верхней границей? Как я могу отобразить его значение в коде .parseList {DayForecast (HashMap (it))} в Android Studio 3.0? В nougat Failure возвращает результат ResultInfo {}} в действие {com.example. *. * / Com.example. *. *. MainActivity}: Android Kotlin Realm Правильный способ запроса + обновление Async Присоединить источники к проекту библиотеки kotlin не отображаются в AS Невозможно создать класс объектов Android Room. В чем разница между фигурными фигурными скобками и нормальными скобками в RxJava с Kotlin Проверьте, прокручивается ли RecyclerView сверху (findFirstCompletelyVisibleItemPosition не работает) Как запросить тип данных Firebase Firestore Reference? Неразрешенная контрольная ошибка в copyOfRange Могу ли я создать KType из reified T

Как создать экземпляр объекта с использованием значений параметров конструктора по умолчанию в Kotlin?

У меня есть класс данных со значениями по умолчанию.

data class Project( val code: String, val name: String, val categories: List<String> = emptyList()) 

Отражение Java не создает экземпляр класса, когда некоторые значения равны нулю. Я получаю исключение

 java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Project.<init>, parameter categories 

Это связано с тем, что метод java.lang.reflect.Constructor<T>.instantiateClass ожидает, что аргументы не равны нулю.

У меня есть информация о типе, у меня есть определение конструктора, но я не уверен, как вызвать конструктор, чтобы он использовал значения по умолчанию (значения поступают из базы данных, а categories могут быть null ). Есть ли способ достичь этого в Котлине?

Solutions Collecting From Web of "Как создать экземпляр объекта с использованием значений параметров конструктора по умолчанию в Kotlin?"

Параметры по умолчанию Kotlin несовместимы с отражением Java, то есть нет простого способа использовать их вместе, потому что параметры по умолчанию Kotlin действительно работают с отдельным методом под капотом, который также передает битную маску, чтобы указать, какие аргументы по умолчанию.

Есть два способа исправить это.

  • Используйте отражение Котлина. Например, функция callBy поддерживает параметры по умолчанию, их можно опустить на карте.

  • Используйте @JvmOverloads для генерации перегрузки без параметра по умолчанию, который можно вызвать в Java.

     @JvmOverloads data class Project( val code: String, val name: String, val categories: List<String> = emptyList() ) 

Поскольку вы передаете значение null и не опуская аргумент, значение по умолчанию не будет принято. https://kotlinlang.org/docs/reference/functions.html#default-arguments

Необходимо указать, что значение может быть равно NULL. Положите ? после типа, если он является нулевым, а затем вы можете проверить и установить все, что вам нужно, в конструкторе.

https://kotlinlang.org/docs/reference/null-safety.html

Esquece O kotlin e vai viver a porra da sua vida, cara. Программа предназначена для тех, кто хочет побывать в этом сезоне. Беста!

Использование в Котлине:

значения по умолчанию в конструкторах берутся только тогда, когда конкретный параметр этого конструктора вообще не передается ему. Это означает, что это делается для достижения различной комбинации конструктора с параметрами. например,

 data class Bird (val name: String = "peacock", val gender: String = "male") 

принимает значения по умолчанию при использовании в качестве Bird (), Bird («голубь») или Bird (gender = «female»).

поэтому для решения вашей проблемы вы должны добавить? рядом с параметром категорий. как это,

 data class Project(val code: String, val name: String, val categories: List<String>?) 

и нет необходимости в параметре emptyList (). Когда вы используете emptyList, как в своем вопросе, вам нужно проверить значение null и опустить этот параметр, как этот

 val project = if(categories == null) { Project(code,name) } else { Project(code,name,categories) } 

То есть при использовании этого класса данных в другом классе kotlin.

Использование в JAVA:

Но если вы хотите использовать этот класс данных в любом классе java, тогда как @Hotkey сказал, что он не поддерживается по умолчанию, так как kotlin поддерживает этот параметр по умолчанию, используя некоторые методы под капотом.

Поэтому, чтобы сделать его совместимым с классом java, вы должны добавить аннотацию @JvmOverloads, но не так, как @Hotkey сказал, что он должен быть аннотирован таким образом

 data class Project @JvmOverloads constructor(val code: String, val name: String, val categories: List<String>? = emptyList())