То, с чем вы столкнулись здесь, является распространенной проблемой, вызванной чем-то, называемым стиранием типов, то есть способом, который реализует java.
Стирание типов может быть объяснено как процесс применения ограничений типов только во время компиляции иотбрасывание информации о типе элемента во время выполнения.[1]
Таким образом, в то время, когда вы пытаетесь десериализовать ваш объект, тип T не известен, и он просто обрабатывается как Object
, а результатом десериализации по умолчанию будет Map
(LinkedHashMap
, если быть точным).
Вы можете сделать свой метод универсальным, передав свой targetClass в качестве дополнительного аргумента к вызову функции, например так:
public <T> EventStream<T> deserialize(String value, Class<T> targetClass)
Затем вы используете TypeFactory изваш маппер для создания типа этого targetClass
JavaType type = mapper.getTypeFactory().constructParametricType(EventStream.class, targetClass);
, который вы можете передать методу readValue:
data = mapper.readValue(value, type);
Полный код:
public <T> EventStream<T> deserialize(String value, Class<T> targetClass){
ObjectMapper mapper = new ObjectMapper();
JavaType type = mapper.getTypeFactory()
.constructParametricType(EventStream.class, targetClass);
try {
return mapper.readValue(value, type);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
[1] https://www.baeldung.com/java-type-erasure