在Kotlin中,您可以创建一个数据类:
data class CountrIEsResponse( val count: Int, val countrIEs: List<Country>, val error: String)
然后您可以使用它来解析JsON,例如“{n:10}”.在这种情况下,您将拥有一个对象val国家:CountrIEsResponse,从Retrofit,Fuel或Gson接收,包含以下值:count = 0,countrIEs = null,error = null.
在Kotlin + Gson – How to get an emptyList when null for data class中,您可以看到另一个示例.
当您稍后尝试使用国家/地区时,您将在此处获得一个例外:val size = countrIEs.countrIEs.size:“kotlin.TypeCastException:null无法转换为非null类型kotlin.Int”.如果你编写代码并使用?访问这些字段时,AndroID Studio会突出显示?并警告:对List< Country>类型的非null接收器进行不必要的安全调用.
那么,我们应该使用吗?在数据类?为什么应用程序在运行时期间可以将null设置为非可空变量?
解决方法:
发生这种情况是因为Gson使用不安全(如在java.misc.Unsafe中)实例构造机制来创建类的实例,绕过它们的构造函数,然后直接设置它们的字段.
有关研究,请参阅此Q& A:Gson Deserialization with Kotlin, Initializer block not called.
因此,Gson忽略了构造逻辑和类状态不变量,因此不建议将它用于可能受此影响的复杂类.它也忽略了setter中的值检查.
考虑一个Kotlin感知的序列化解决方案,例如Jackson(在上面链接的Q& A中提到)或kotlinx.serialization
.
以上是内存溢出为你收集整理的android – 为什么Kotlin数据类在Gson的非可空字段中可以有空值?全部内容,希望文章能够帮你解决android – 为什么Kotlin数据类在Gson的非可空字段中可以有空值?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)