当通用类型信息不可用时,如何避免编译器警告?

时间:2011-12-14 17:37:20

标签: java generics reflection generic-collections

我正在使用Spring的RestTemplate来对REST Web服务进行调用。其中一个调用是返回某种类型的对象列表。 RestTemplate方法要求提供类参数以指示预期的返回类型。

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

显然,这不会编译。当您提供类似的类型参数时,您无法获得静态.class属性。当我删除type参数时,代码会编译,但会生成rawtypes编译器警告。

我的问题很简单。我是坚持抑制编译器警告还是有更简洁的方法来编写代码?

1 个答案:

答案 0 :(得分:3)

但RestTemplate如何知道将列表元素转换为类Foo的实例?您是否尝试过运行代码,并按预期工作?

我能想到的一种方法是使用Array作为输入类型。例如

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

但我不知道是否支持。如果你真的需要反序列化更复杂的数据类型,那么你应该考虑使用Jackson或Gson。

使用Jackson,您可以使用ObjectMapper类轻松地从大多数来源反序列化数据。

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

上述工作原理是因为您有意创建了一个扩展TypeReference的匿名类,该类将在运行时记住它的泛型类型,因此它可以帮助对象映射器创建Foo列表。 For a fuller explanation