我正在尝试将此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中为盒装和原始布尔值注册类型适配器的正确方法是什么?
答案 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}})。