¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?

Tengo una class de datos con valores pnetworkingeterminados.

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

La reflexión de Java no crea una instancia de la class cuando algunos valores son nulos. Estoy recibiendo una exception

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

Esto se debe a que el método java.lang.reflect.Constructor<T>.instantiateClass espera arguments que no sean nulos.

Tengo la información del tipo, tengo la definición del constructor pero no estoy seguro de cómo llamar al constructor para que use los valores pnetworkingeterminados (los valores provienen de la database y las categories pueden ser null ). ¿Hay alguna forma de lograr esto en Kotlin?

Los parameters pnetworkingeterminados de Kotlin no son compatibles con la reflexión de Java, lo que significa que no hay una manera simple de usarlos juntos, porque los parameters pnetworkingeterminados de Kotlin en realidad funcionan con un método separado debajo del capó que también pasa una máscara de bits para especificar qué arguments son pnetworkingeterminados.

Hay dos forms de arreglar esto.

  • Usa la reflexión de Kotlin. Por ejemplo, la function callBy admite parameters pnetworkingeterminados, se pueden omitir en el map.

  • Use @JvmOverloads para generar una sobrecarga sin el parámetro pnetworkingeterminado al que se puede llamar en Java.

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

Dado que está pasando nulo y no omite el argumento, no se tomará el valor pnetworkingeterminado. https://kotlinlang.org/docs/reference/functions.html#default-arguments

Debe especificar que el valor puede ser anulable. Pon un ? después del tipo si es anulable, y luego puedes verificar y configurar lo que necesites en el constructor.

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

Esquece O kotlin e vai viver a porra da sua vida, cara. Tá dentro de casa progtwigndo enquanto o tempo tá passando y os seus neurônios morrendo. Besta!

Usando en Kotlin:

los valores pnetworkingeterminados en los constructores se toman solo cuando el parámetro particular de ese constructor no se le pasa en absoluto. Eso significa que se hace para lograr varias combinaciones de constructor parametrizado. por ejemplo,

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

toma valores pnetworkingeterminados cuando se usa como Bird (), Bird ("paloma") o Bird (género = "hembra").

entonces para resolver tu problema tienes que agregar? al lado del parámetro de categorías. Me gusta esto,

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

y no hay necesidad de emptyList () por defecto. Cuando usa emptyList como en su pregunta, debe verificar nulo y omitir ese parámetro como este

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

Eso es cuando se usa esta class de datos en otra class de kotlin.

Usando en JAVA:

Pero si desea utilizar esta class de datos en cualquier class Java, entonces como @Hotkey dijo que no es compatible por defecto, ya que kotlin admite este parámetro pnetworkingeterminado mediante el uso de algunos methods debajo del capó.

Por lo tanto, para que sea compatible con la class java, debe agregar la anotación @JvmOverloads, pero no como @Hotkey dijo que debe tener una anotación como esta.

 data class Project @JvmOverloads constructor(val code: String, val name: String, val categories: List<String>? = emptyList()) 
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?
  • ¿Cómo get una KClass de Array?
  • Configurar la reflexión de kotlin, class.java no funciona
  • Crear una nueva instancia de una KClass
  • Kotlin, cómo recuperar el valor del campo a través de la reflexión
  • ¿Cómo get una class de time de ejecución de una variable en Kotlin?
  • ¿Puedo get una KFunction de una variable del tipo de function en Kotlin?
  • Cómo acceder a los objects-miembros de una statement de object en kotlin
  • Usar reflexión para pasar y modificar una primitiva sin usar matriz
  • El operador de Kotlin Reflection obtiene la implementación
  • ¿Cómo cambiar un campo de miembro con la reflexión de Kotlin?