Вам следует взглянуть на Effective Java 2, Item 29: Рассмотреть типы безопасных контейнеров гетерогенного типа
Основная идея заключается в том, что вы можете представить, что у вас есть Deserializer
интерфейс.Тогда вы можете иметь Map<Class<?>, Deserializer<String, Object>>
.Карта в основном представляет собой реестр от типа к правильному Deserializer
для этого типа (который десериализуется из типа String (возможно, вам нужен тип json или что-то вместо String, но String работает) в тип интереса.
Реальная хитрость в том, что вы должны принудительно обеспечить соответствие типа ключа класса типу десериализатора, т. Е. - для некоторого класса, являющегося ключом на карте, в качестве значения используется десериализатор.это с помощью универсального метода. Например:
<T> void put(Class<T> clazz, Deserializer<String, T> deserializer) {
map.put(clazz, deserializer);
}
Затем, чтобы использовать гетерогенную карту, вы можете снова использовать универсальный метод:
<T> T deserialize(Class<T> typeToDeserializeFromJson, String toDeserialize) {
return typeToDeserializeFromJson.cast(
deserializers.get(tTDFJ).deserialize(toDeserialize));
}
Вы используете тип, указанный ввызывающий метод для
- поиска нужного `Deserializer`
- десериализации текста json в` Object`
- безопасно приведёт `Object` к нужному типу, который, как мы знаем, безопасен, потому чтоо том, как мы построили карту.
Я надеюсь, что то, что я сказал, было, по крайней мере, несколько ясным. Чтение соответствующей записи в EJ2 должно помочь!
ОБНОВЛЕНИЕ:
Как отмечает Абхинав , библиотека GSON поможет вам достичь вашей конечной цели десериализации объектов таким образом, чтобы использовать дженерики соответствующим образом.Тем не менее, я думаю, что ваш вопрос больше касается дженериков, чем конечной цели, поэтому я считаю, что мой ответ более уместен.GSON должен быть реализован с использованием контейнера гетерогенного типа: -).
Спасибо, Abhinav за указание на GSON!