Intereting Posts
версия kotlin, которая используется для построения с градиентом (1.1.2-5), отличается от той, что включена в плагин IDE (1.1.2-4) Функция котлинской складчатости Зависимость между задачами Как получить PhoneStateListener при использовании функций Dual SIM правильное поведение сопрограмм? KotlinNullPointerException: внутри onCreateOptionsMenu не удается найти searchView; андроид Как я могу написать идиоматический код kotlin, который перебирает подпроцесс и обрабатывает его вывод? Параметры и внутренние параметры рефицированного типа Мне нужно знать, почему? и если я изменю эту строку на "println (name + two)" ошибка решена? SearchView всегда расширялся, на панели инструментов? java.lang.NoClassDefFoundError: com.example.api.retrofit.AuthenticationInterceptor $ перехват $ 1 Gson setDateFormat исключает, когда дата равна нулю Ссылки функций и лямбда Что делать в Espresso, когда recyclerView сам возвращает AmbiguousViewMatcherException? Как desgin класс для json, когда я использую Gson в Kotlin?

Как создать экземпляр объекта с использованием значений параметров конструктора по умолчанию в 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())