Как зарегистрировать адаптер типа для boolean.class / Boolean :: class.javaPrimitiveType и Boolean.class / Boolean.class.java - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь преобразовать этот пример 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 голосов
/ 28 сентября 2018

Оба варианта использования класса Boolean компилируются в примитивный логический тип.Вам необходимо использовать javaObjectType в дополнение к javaPrimitiveType, например так:

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

Это приведет к первому вызову с использованием Boolean.class ивторое использование Boolean.TYPE (Class для примитива boolean).

...