当泛型类型信息不可用时,如何避免编译器警告?
我正在使用 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
属性。当我删除类型参数时,代码会编译,但这会生成 rawtypes
编译器警告。
我的问题很简单。我是否坚持抑制编译器警告,或者是否有更干净的方法来为此编码?
I'm using Spring's RestTemplate
to make calls against a REST web service. One of these calls is to return a list of objects of a certain type. The RestTemplate
methods require that a class argument be supplied to indicate the expected return type.
// restTemplate is type org.springframework.web.client.RestTemplate
URI restServiceURI = new URI("http://example.com/foo")
restTemplate.getForObject(restServiceURI, List<Foo>.class);
Obviously, this doesn't compile. You cannot get a static .class
property when you supply the type argument like that. The code compiles when I remove the type argument, but that generates a rawtypes
compiler warning.
My question is simple. Am I stuck with suppressing the compiler warning or is there a cleaner way to code for this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
但是 RestTemplate 如何知道将列表元素转换为类
Foo
的实例?您是否尝试过运行代码,它是否按预期工作?我能想到的解决这个问题的一种方法是使用数组作为输入类型。例如。
但不知道是否支持。如果您确实需要反序列化更复杂的数据类型,那么您应该考虑使用 Jackson 或 Gson。
对于 Jackson,您可以使用 ObjectMapper类可以轻松地反序列化大多数来源的数据。
上面的方法之所以有效,是因为您有意创建一个扩展 TypeReference 的匿名类,该类将在运行时记住其泛型类型,因此它可以帮助对象映射器创建 Foo 列表。 获取更完整的解释。
But how would the RestTemplate know to convert the list elements to instances of class
Foo
? Have you tried running the code, and does it work as expected?One way I can think of getting round this would be to use an Array as an input type. eg.
But I don't know if that's supported. If you really need to deserialise more complex data types then you should consider using Jackson or Gson.
With Jackson you can use the ObjectMapper class to easily deserialise data from most sources.
The above works because you intentionally create an anonymous class that extends TypeReference, the class will remember its generic types at runtime and so it can help the object mapper to create lists of Foo. For a fuller explanation.