gpt4 book ai didi

android - 将 kotlin 转译为 java 后,Notnull 变量变为可为空

转载 作者:搜寻专家 更新时间:2023-11-01 07:44:03 24 4
gpt4 key购买 nike

当我有一个像这样的 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)

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

这就是为什么对象创建会成功并使 Kotlin 关于该对象的静态证明无效的原因。非空属性将以空值结束。

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

关于android - 将 kotlin 转译为 java 后,Notnull 变量变为可为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48544201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com