将kotlin转换为java后,Notnull变量变为可为空

时间:2018-01-31 14:12:21

标签: android kotlin nullable transpiler

当我有一个kotlin类时,假设uniqueName是NotNull。

selecteditem =  adapterView.getItemAtPosition(i).toString();

但是当我测试这段代码时

es

它返回

data class Payload(
        @SerializedName("unique_name") val uniqueName: String, 
        @SerializedName("nbf") val nbf: Int, 
        @SerializedName("exp") val exp: Int, 
        @SerializedName("iat") val iat: Int
)

那么我的对象中的uniqueName如何变为可空?

2 个答案:

答案 0 :(得分:4)

这一行

gsonHelper.fromStringJsonToObject(payloadJsonString, Payload::class.java)

委托给低级别的,未指定的Unsafe.allocateInstance()调用,该调用分配一个对象而不调用任何构造函数。然后它使用反射来写字段。这绕过了Kotlin应该建立静态类型不变量的障碍:构造函数代码中的断言。

这就是为什么对象创建会成功并使Kotlin关于对象的静态证明失效的原因。非null属性最终将为null值。

对于不了解Kotlin可空性规则的Java库通过反射创建的对象,应该避免使用不可为空的属性。这将让Kotlin方面从一个有效点开始,然后编译器将引导您完成通常的举动仪式,根据需要将可空值提升为不可空值。

答案 1 :(得分:0)

它不可为空:如果您尝试访问uniqueName字段,您将获得NPE。

Gson不知道可空/不可空属性,并将使用默认值来删除条目。您的json不包含unique_nameString的默认值为null

相关问题