【问题标题】:How can I instantiate an object using default constructor parameter values in Kotlin?如何使用 Kotlin 中的默认构造函数参数值实例化对象?
【发布时间】:2017-09-15 17:55:33
【问题描述】:

我有具有默认值的数据类。

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&lt;T&gt;.instantiateClass 方法需要不为空的参数。

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

【问题讨论】:

    标签: reflection kotlin kotlin-null-safety kotlin-reflect


    【解决方案1】:

    Kotlin 默认参数与 Java 反射不兼容,这意味着没有简单的方法可以将它们一起使用,因为 Kotlin 默认参数实际上在后台使用一个单独的方法,该方法还传递了一个位掩码来指定哪些参数是默认。

    有两种方法可以解决此问题。

    【讨论】:

      【解决方案2】:

      在 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>?)
      

      并且不需要 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())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        相关资源
        最近更新 更多