Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection 如何使用Kotlin中的默认构造函数参数值实例化对象?_Reflection_Kotlin_Kotlin Null Safety_Kotlin Reflect - Fatal编程技术网

Reflection 如何使用Kotlin中的默认构造函数参数值实例化对象?

Reflection 如何使用Kotlin中的默认构造函数参数值实例化对象?,reflection,kotlin,kotlin-null-safety,kotlin-reflect,Reflection,Kotlin,Kotlin Null Safety,Kotlin Reflect,我有一个带有默认值的数据类 data class Project( val code: String, val name: String, val categories: List<String> = emptyList()) 数据类项目( val代码:字符串, val name:String, val类别:List=emptyList()) 当某些值为null时,Java反射无法实例化该类。我有个例外 java.lang.IllegalArgumentE

我有一个带有默认值的数据类

data class Project(
    val code: String,
    val name: String,
    val categories: List<String> = emptyList())
数据类项目(
val代码:字符串,
val name:String,
val类别:List=emptyList())
当某些值为null时,Java反射无法实例化该类。我有个例外

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Project.<init>, parameter categories
java.lang.IllegalArgumentException:指定为非null的参数为null:method Project.,参数类别
这是因为
java.lang.reflect.Constructor.InstanceClass
方法要求参数不为null


我有类型信息,我有构造函数定义,但我不确定如何调用构造函数以使其使用默认值(值来自数据库,并且
类别
可以
null
)。有没有办法在Kotlin中实现这一点?

在Kotlin中使用:

只有当构造函数的特定参数根本没有传递给它时,才会使用构造函数中的默认值。这意味着这样做是为了实现参数化构造函数的各种组合。 比如说,

data class Bird (val name: String = "peacock", val gender: String = "male")
当用作Bird()、Bird(“dove”)或Bird(gender=“female”)时,采用默认值

那么,要解决您的问题,您必须添加?“类别”参数旁边。 像这样,

data class Project(val code: String,
                   val name: String,
                   val categories: List<String>?)
即在另一个kotlin类中使用此数据类时

在JAVA中使用:

但是,如果您想在任何java类中使用这个数据类,那么@Hotkey说默认情况下不支持它,因为kotlin通过在引擎盖下使用一些方法来支持这个默认参数

所以,为了使它与java类兼容,您必须添加注释,但不能像@Hotkey所说的那样添加注释

data class Project @JvmOverloads constructor(val code: String,
                                             val name: String,
                                             val categories: List<String>? = emptyList())
数据类项目@JVM重载构造函数(val代码:String,
val name:String,
val类别:列表?=emptyList())

Kotlin默认参数与Java反射不兼容,这意味着没有简单的方法将它们一起使用,因为Kotlin默认参数实际上与一个单独的方法一起工作,该方法还通过一个位掩码来指定哪些参数是默认参数

有两种方法可以解决这个问题

  • 使用Kotlin反射。例如,该函数支持默认参数,可以从映射中省略这些参数

  • 使用可以在Java中调用的

    @JvmOverloads
    data class Project(
        val code: String,
        val name: String,
        val categories: List<String> = emptyList()
    )
    
    @JvmOverloads
    数据类项目(
    val代码:字符串,
    val name:String,
    val类别:List=emptyList()
    )
    
@JvmOverloads
data class Project(
    val code: String,
    val name: String,
    val categories: List<String> = emptyList()
)