Почему я не могу использовать TypeToken так, как мне нужно? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь решить проблему, возникающую при десериализации HashMap<Integer, MyParcelablePojo>. Пытаясь найти ответ, я нашел следующие вопросы:

Если я попробую с:

HashMap<Integer, MyParcelablePojo> mHashMap = new Gson().fromJson(the_json_string, HashMap.class);

... полученный HashMap содержит LinkedTreeMap объектов вместо MyParcelablePojo объектов.

Из-за этого я попытался использовать TypeToken аналогично тому, как я видел во втором вопросе, связанном выше, но он не позволяет мне указать параметры HashMap. Если я попытаюсь:

// XXX I am not sure if this "Type" is the correct one
//     there were several "Type" classes to choose from
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;

Type collection_type = new TypeToken<HashMap<Integer, MyParcelablePojo>>();

... Android Studio показывает эту ошибку:

«TypeToken ()» имеет защищенный доступ в «com.google.gson.reflect.TypeToken»

... просто для того, чтобы придерживаться примера, который я видел, я попытался с помощью new TypeToken<HashMap<T>> проверить, исчезла ли ошибка (просто для любопытства, я вообще не заинтересован в использовании универсального T для этого), и затем он сказал: «не могу решить Т», что слишком странно ... но это не имеет отношения к моей проблеме, я просто добавил ее ради полноты ...

... возвращаясь к точке , так что конструктор TypeToken защищен, верно? Таким образом, расширение класса может помочь, верно? Но если я увижу конструктор, это будет слишком странно для меня, чтобы понять. Параметризованные типы очень странно использовать таким образом (по крайней мере, для моего текущего понимания их). Часть <? super T> немного сбивает с толку (похоже, она вызывает родительский тип T, но я просто не до конца понимаю). Но, что еще более странно для меня, это $Gson$Types.getRawType(type) ... Интересно, для чего эти $ используются ...:

protected TypeToken() {
    this.type = getSuperclassTypeParameter(getClass());
    this.rawType = (Class<? super T>) $Gson$Types.getRawType(type);
    this.hashCode = type.hashCode();
}

Прямо в точку

Я просто хочу избежать того, что метод Gson.fromJson возвращает LinkedTreeMap в качестве значений вместо MyParcelablePojo. Ответы, представленные в связанных вопросах, кажутся мне слишком общими, поэтому я не понимаю, как применить их к моему делу (обратите внимание, что сейчас я не заинтересован в универсальности). Я даже сомневаюсь, что они могут быть применимы к моему делу.

Основной мотив, которым я пользуюсь HashMap, заключается в том, что я хочу сам определять индексы, используя базу идентификаторов. Что я должен сделать, чтобы решить эту проблему десериализации из строки JSON должным образом?

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Вы создаете экземпляр TypeToken путем создания подкласса, который обычно является анонимным:

Type collection_type = new TypeToken<HashMap<Integer, MyParcelablePojo>>(){}.getType();

Обратите внимание на {} в моем ответе.Причина этого объясняется в JavaDoc:

/**
 * Represents a generic type {@code T}. Java doesn't yet provide a way to
 * represent generic types, so this class does. Forces clients to create a
 * subclass of this class which enables retrieval the type information even at
 * runtime.
 *
 * <p>For example, to create a type literal for {@code List<String>}, you can
 * create an empty anonymous inner class:
 *
 * <p>
 * {@code TypeToken<List<String>> list = new TypeToken<List<String>>() {};}
 *
 * <p>This syntax cannot be used to create type literals that have wildcard
 * parameters, such as {@code Class<?>} or {@code List<? extends CharSequence>}.
 *
 * @author Bob Lee
 * @author Sven Mawson
 * @author Jesse Wilson
 */
1 голос
/ 07 июня 2019

Я не думаю, что вы правильно использовали TypeToken, я делал;

HashMap<Integer, GenericObject> mHashMap = new Gson().fromJson(json, new TypeToken<HashMap<Integer, GenericObject>>(){}.getType());

Где вы передаете тип, а не фактический токен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...