将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