2015-02-13 5 views
4

Вот мой фрагмент кода, а новый «constructParameterizedType» не соответствует моим потребностям (если только я не упустил что-то, что, как я предполагаю, я). У меня есть обобщенный класс под названием Result, где T - любой базовый класс, который расширяет мой базовый класс «Надувной». представляет запись данных, поступающую обратно из Salesforce REST API ... так вот пример кода, который работает:Jackson constructParametricType устарел, но constructParameterizedType не работает то же самое

Class c = Class.forName("sfshare.UserRecord"); 
JavaType type = mapper.getTypeFactory().constructParametricType(Result.class, c); 
Result<T> res = mapper.readValue(rspData, type); 

Но если я использую более новый (не рекомендуется) «constructParameterizedType()» метод, это же код не будет компилироваться, потому что он не соответствует параметрам constructParameterizedType. Но constructParameterizedType пока не используется много, и нет примеров для использования ... только Javadoc - что не имеет смысла для моего прецедента.

ответ

3

Если вы посмотрите на аргументы и, в частности, Javadocs, вы заметите, что существует новый тип: 2-й аргумент - это целевая «цель» для параметров. Чтобы дать пример смысла в том, что если вы хотите построить эквивалент:

ArrayList<String> 

, что вы хотите передать в качестве аргументов:

constructParameterizedType(ArrayList.class, List.class, String.class) 

или, возможно, Collection.class для второго аргумента. Подумайте об этом как о соответствующем типе, к которому вы пытаетесь предоставить параметры.

Основная причина этого изменения несколько сложна и связана с обработкой «дополнительных» интерфейсов, таких как Iterable<T>: для этих случаев необходимо предоставить разные классы.

Но в большинстве случаев использования конечного пользователя вам просто нужно передать тот же класс, что и первый и второй аргументы.

3

Попробуйте это:

Class c = Class.forName("sfshare.UserRecord"); 
TypeFactory typeFactory = mapper.getTypeFactory(); 
JavaType type = typeFactory.constructParametrizedType(Result.class, Result.class, c); 
Result<T> res = mapper.readValue(rspData, type); 

или если ваш Result<T> класс реализует интерфейс:

JavaType type = typeFactory.constructParametrizedType(Result.class, ResultInterface.class, c); 
Смежные вопросы