Kotlin不可为空值可以为null?
我有后端,返回给我一些JSON。
我解析到我的课堂:
class SomeData( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String)
使用gson转换器工厂:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(ENDPOINT) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build();
并在我的界面:
interface MyAPI { @GET("get_data") Observable<List<SomeData>> getSomeData(); }
然后我从服务器(与rxJava)检索数据没有任何错误。 但我期待一个错误,因为我认为我应该这样做(为了防止GSON转换器错误,因为notNullableValue
不存在于我的JSON响应):
class SomeData @JvmOverloads constructor( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String = "")
在从后端接收数据并解析到具有不带def值的构造函数的我的SomeData类之后, notNullableValue == null的值 。
据我所知不可空值在Kotlin可以为空?
是的,那是因为你给它一个默认值。 当然,它永远不会是空的。 这是默认值的整个点。
从构造函数中删除=""
,你会得到一个错误。
编辑:发现问题。 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/