Как избежать предупреждений компилятора, когда универсальная информация о типе недоступна? - PullRequest
5 голосов
/ 14 декабря 2011

Я использую Spring * RestTemplate для звонков на веб-сервис REST.Один из этих вызовов - вернуть список объектов определенного типа.Методы RestTemplate требуют предоставления аргумента класса для указания ожидаемого типа возвращаемого значения.

// restTemplate is type org.springframework.web.client.RestTemplate
URI restServiceURI = new URI("http://example.com/foo")
restTemplate.getForObject(restServiceURI, List<Foo>.class);

Очевидно, это не компилируется.Вы не можете получить статическое свойство .class, когда вы предоставляете аргумент типа таким образом.Код компилируется, когда я удаляю аргумент типа, но это генерирует rawtypes предупреждение компилятора.

Мой вопрос прост.Я застрял с подавлением предупреждения компилятора или есть более чистый способ кодирования для этого?

1 Ответ

3 голосов
/ 14 декабря 2011

Но как RestTemplate узнает, как преобразовать элементы списка в экземпляры класса Foo? Вы пытались запустить код, и он работает, как ожидалось?

Один из способов обойти это - использовать массив в качестве типа ввода. например.

restTemplate.getForObject(restServiceURI, Foo[].class);

Но я не знаю, поддерживается ли это. Если вам действительно нужно десериализовать более сложные типы данных, вам следует подумать об использовании Джексона или Гсона.

С Джексоном вы можете использовать класс ObjectMapper для простой десериализации данных из большинства источников.

String input = ...;
ObjectMapper mapper = new ObjectMapper();
List<Foo> list = mapper.readValue(input, new TypeReference<List<Foo>>(){});

Вышесказанное работает, потому что вы намеренно создаете анонимный класс, который расширяет TypeReference, класс будет помнить свои универсальные типы во время выполнения, и поэтому он может помочь мапперу объектов создавать списки Foo. Для более полного объяснения .

...