Object 翻新在初始化时跳过数据类的init{}块

Object 翻新在初始化时跳过数据类的init{}块,object,kotlin,initialization,retrofit,pojo,Object,Kotlin,Initialization,Retrofit,Pojo,我将根据DClass abstract class Data(p: String) { var a1: String var a2: String init { """(\w+)(\d+)""".toRegex().find(p)!!.groupValues.run { a1 = "a1 is ${get(1)}" a2 = "a2 is ${get(2)}" } } } data

我将根据
DClass

abstract class Data(p: String) {
    var a1: String
    var a2: String

    init {
        """(\w+)(\d+)""".toRegex().find(p)!!.groupValues.run {
            a1 = "a1 is ${get(1)}"
            a2 = "a2 is ${get(2)}"
        }
    }
}

data class DClass(val p1: String, val p2: String) : Data(p1)
然后在创建
DClass
之后,我能够获得
a1
a2
的值:

DClass("string1", "string2").run { println("$a1 $a2") }
它返回“a1是
string
a2是
1
”它应该返回的值

接下来,我将尝试通过正确的JSON响应进行改装初始化DClass:
@GET(“loadDClass”)挂起有趣的dClass():dClass

abstract class Data(p: String) {
    var a1: String
    var a2: String

    init {
        """(\w+)(\d+)""".toRegex().find(p)!!.groupValues.run {
            a1 = "a1 is ${get(1)}"
            a2 = "a2 is ${get(2)}"
        }
    }
}

data class DClass(val p1: String, val p2: String) : Data(p1)
如果让程序执行与
a1
a2
相同的输出,它只会返回:

“a1为
null
a2为
null

因此,我发现
init{}
块的
数据
被跳过,因为改型只构建
DClass
,而不进行初始化


是否可以不手动初始化抽象类的变量?

不会调用
init
块,因为
GsonConverterFactory
(我假设您使用它,因为它在这种情况下非常常见)以一种特殊的方式构造
DClass
,而不调用其构造函数。特别是,使用了一个名为的内部类。该类的JavaDoc声明:

/**
 * Do sneaky things to allocate objects without invoking their constructors.
 * [...]
 */
您可以编写自己的改装
Converter.Factory
,但那太过分了。我建议您向
DClass
添加一个简单的成员函数,而不是从
数据
继承,并从
数据
中删除
摘要
关键字
DClass
应如下所示:

data class DClass(val p1: String, val p2: String)
    fun newData(): Data = Data(p1)
}
然后,您可以从响应的
body()
构建
Data
实例:

call.execute().body()?.newData()?.run { println("$a1 $a2") }