如何为boolean.class / Boolean :: class.javaPrimitiveType和Boolean.class / Boolean.class.java注册类型适配器

时间:2018-09-25 19:11:20

标签: kotlin gson code-conversion

我正在尝试将此Java示例转换为Kotlin:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Boolean.class, new JsonStrictBooleanDeserializer())
        .registerTypeAdapter(boolean.class, new JsonStrictBooleanDeserializer())
        .create();
val gson = GsonBuilder()
        .registerTypeAdapter(Boolean::class.java, JsonStrictBooleanDeserializer())
        .registerTypeAdapter(Boolean::class.javaPrimitiveType, JsonStrictBooleanDeserializer())
        .create()

但是,它们的行为似乎不同。我反编译了Kotlin示例,似乎只注册了一种类型的适配器:

(new GsonBuilder())
        .registerTypeAdapter((Type)Boolean.TYPE, new JsonStrictBooleanDeserializer())
        .registerTypeAdapter((Type)Boolean.TYPE, new JsonStrictBooleanDeserializer())
        .create();

在Kotlin中为盒装和原始布尔值注册类型适配器的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

您对Boolean类的两种使用都被编译为原始布尔类型。除了javaObjectType外,您还需要使用javaPrimitiveType,就像这样:

val gson = GsonBuilder()
        .registerTypeAdapter(Boolean::class.javaObjectType, JsonStrictBooleanDeserializer())
        .registerTypeAdapter(Boolean::class.javaPrimitiveType, JsonStrictBooleanDeserializer())
        .create()

这将导致第一次调用使用Boolean.class,第二次调用Boolean.TYPE(原始Class的{​​{1}})。