将kotlin转换为java后,Notnullvariables可以为空
当我有一个这样的kotlin类时,假设uniqueName是NotNull。
data class Payload( @SerializedName("unique_name") val uniqueName: String, @SerializedName("nbf") val nbf: Int, @SerializedName("exp") val exp: Int, @SerializedName("iat") val iat: Int )
但是当我测试这个代码
@Test fun fromStringJsonToObject4() { val gsonHelper = GsonHelper() val payloadJsonString = "{}" val payload = Payload("", 0, 0, 0) assertEquals(gsonHelper.fromStringJsonToObject(payloadJsonString, Payload::class.java), payload) }
它返回
Expected :Payload(uniqueName=null, nbf=0, exp=0, iat=0) Actual :Payload(uniqueName=, nbf=0, exp=0, iat=0)
所以如何在我的对象uniqueName成为空?
这条线
gsonHelper.fromStringJsonToObject(payloadJsonString, Payload::class.java)
委托给低级别,未指定的Unsafe.allocateInstance()
调用,它分配一个对象而不调用任何构造函数。 然后它使用reflection来写字段。 这规避了Kotlin应该建立静态types不变式的障碍:构造函数代码中的断言。
这就是为什么创建对象会成功并使Kotlin关于对象的静态certificate无效。 非空属性将以空值结束。
您应该避免使用不知道Kotlin的可空规则的Java库reflection创建的对象的不可空属性。 这将使Kotlin方面从一个有效的角度出发,然后编译器将引导您完成通常的可以为空的值为不可空值的仪式。
这是不可空的:如果你尝试访问uniqueName
字段,你会得到一个NPE。
Gson不知道可空/不可空的属性,并使用缺省值的缺省值。 您的json不包含unique_name
,并且String
的默认值为null
。