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

发布于 2024-12-21 05:53:34 字数 504 浏览 1 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

﹏半生如梦愿梦如真 2024-12-28 05:53:34

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

我能想到的解决这个问题的一种方法是使用数组作为输入类型。例如。

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 列表。 获取更完整的解释

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.

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

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.

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文