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/