bit*_*ale 12 gson kotlin kotlin-null-safety
我有后端给我一些json.
我把它解析给我的班级:
class SomeData(
@SerializedName("user_name") val name: String,
@SerializedName("user_city") val city: String,
var notNullableValue: String)
Run Code Online (Sandbox Code Playgroud)
使用gson转换器工厂:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ENDPOINT)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
Run Code Online (Sandbox Code Playgroud)
在我的界面:
interface MyAPI {
@GET("get_data")
Observable<List<SomeData>> getSomeData();
}
Run Code Online (Sandbox Code Playgroud)
然后我从服务器(使用rxJava)检索数据,没有任何错误.但我期待一个错误,因为我认为我应该做这样的事情(以防止GSON转换器错误,因为notNullableValue我的JSON响应中不存在):
class SomeData @JvmOverloads constructor(
@SerializedName("user_name") val name: String,
@SerializedName("user_city") val city: String,
var notNullableValue: String = "")
Run Code Online (Sandbox Code Playgroud)
从后端接收数据并使用没有def值的构造函数解析到我的SomeData类之后,notNullableValue的值== null.
据我所知,在Kotlin中,不可空的值可以为空?
Str*_*lok 17
是的,那是因为你给它一个默认值.当然,它永远不会是空的.这是默认值的重点.
=""从构造函数中删除,您将收到错误.
编辑:发现问题.GSON使用的魔术sun.misc.Unsafe类有一个allocateInstance显然被认为非常的方法,unsafe因为它的作用是跳过初始化(构造函数/字段初始化器等)和安全检查.所以你的答案是为什么Kotlin非可空字段可以为空.违规代码在com/google/gson/internal/ConstructorConstructor.java:223
关于该Unsafe课程的一些有趣细节:http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/
| 归档时间: |
|
| 查看次数: |
3287 次 |
| 最近记录: |