当前位置: 首页 > 知识库问答 >
问题:

Kotlin不能为空的值可以为空吗?

刘才俊
2023-03-14

我有返回给我一些JSON后端。

我将其解析为我的类:

class SomeData(
  @SerializedName("user_name") val name: String,
  @SerializedName("user_city") val city: String,
  var notNullableValue: String)
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 = "")

在从后端接收数据并将其解析到带有构造函数的SomeData类(不带def值)之后,notNullableValue的值==NULL。

据我所知,在Kotlin中不是可空值可以是空的吗?

共有1个答案

水飞掣
2023-03-14

是的,这是因为您给了它一个默认值。当然,它永远不会是空的。这就是默认值的全部意义。

从构造函数中删除=“”,您将得到一个错误。

编辑:发现问题。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/

 类似资料:
  • 我有一堆数据类,其中的值需要为null,因为数据库可能会为某些字段返回null。 据我所知,只有当Long是实际的Long而不是null时,才应该将该值传递给ApiClass构造函数,如果它是null,我会假设它将保持在构造中给出的默认值(在本例中为0) Info.extendedinfo.income是一个Long,它也可能是null,但是如果是null,它应该映射为0。 但是既然数据类很长呢?

  • 在Kotlin中,您可以创建: 然后可以使用它解析JSON,例如“{n:10}”。在这种情况下,您将有一个对象,从、或接收,它包含以下值:。 在Kotlin+GSON-How to get a emptyList when null for data类中,您可以看到另一个示例。 当您以后尝试使用时,您将在这里得到一个异常::“Kotlin.TypeCastException:null不能被强制转换

  • 我们知道我们可以将null赋给可为null的类型。例如: 我们知道第二种说法是有效的,因为有人告诉我们它是有效的,我们只是接受它,而不问为什么。但如果查看的源代码,则为: 我们可以将赋给为的原因是由于隐式运算符,它允许您隐式强制转换int为。根据隐式运算符的规则,作为的右手边,必须是结构类型,但显然不是合法的结构值,那么如何做(更不用说本身就是一个结构),为什么不违反隐式运算符规则

  • 以下是我的进口: 奇怪的是,它以前曾经工作过,我不知道发生了什么会影响这一点。

  • 问题内容: 下面是我的表结构 我正在执行查询,它向我显示列不能为空,这是我的查询 错误-列’physician_minc’不能为空 不是必填字段。我该如何解决这个问题? 问题答案: 您已将not null值定义为’physician_minc’: 如何将null值传递给它。首先,您需要将列设置为null,然后才可以传递所需的null值。