当我有一个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如何变为可空?
答案 0 :(得分:4)
这一行
gsonHelper.fromStringJsonToObject(payloadJsonString, Payload::class.java)
委托给低级别的,未指定的Unsafe.allocateInstance()
调用,该调用分配一个对象而不调用任何构造函数。然后它使用反射来写字段。这绕过了Kotlin应该建立静态类型不变量的障碍:构造函数代码中的断言。
这就是为什么对象创建会成功并使Kotlin关于对象的静态证明失效的原因。非null属性最终将为null值。
对于不了解Kotlin可空性规则的Java库通过反射创建的对象,应该避免使用不可为空的属性。这将让Kotlin方面从一个有效点开始,然后编译器将引导您完成通常的举动仪式,根据需要将可空值提升为不可空值。
答案 1 :(得分:0)
它不可为空:如果您尝试访问uniqueName
字段,您将获得NPE。
Gson不知道可空/不可空属性,并将使用默认值来删除条目。您的json不包含unique_name
,String
的默认值为null
。