【问题标题】:RestTemplate get list of objects - Why use ParameterizedTypeReference instead of object array?RestTemplate 获取对象列表 - 为什么使用 ParameterizedTypeReference 而不是对象数组?
【发布时间】:2020-02-03 20:29:11
【问题描述】:

我正在尝试使用 Spring RestTemplate 获取对象列表。我很困惑为什么选择 ParameterizedTypeReference 方法来使用 restTemplate 而不是只使用 Object[].class 来获取对象列表?

我已经检查了多个建议使用 ParameterizedTypeReference 的答案。但是为什么我不能只使用 Object[].class?我有什么限制?

我已经检查了这个链接 (https://stackoverflow.com/a/49752261/6001027),它说,我只能在简单的情况下使用 Object[],并且在处理复杂的 json 结构时必须使用 ParameterizedTypeReference。有人能解释一下在什么情况下我不能使用 Object[] 方法吗?

ParameterizedTypeReference 方法:

ResponseEntity<List<Rating>> responseEntity =
                restTemplate.exchange("http://localhost:8084/ratingsdata/user/" + userId,
                        HttpMethod.GET, null, new ParameterizedTypeReference<List<Rating>>() {
                        });
List<Rating> ratings = responseEntity.getBody();

Object[] 方法:

List<Rating> ratings = Arrays.asList(restTemplate.getForObject("http://localhost:8084/ratingsdata/user/"+userId, Rating[].class));

【问题讨论】:

    标签: java arrays spring arraylist resttemplate


    【解决方案1】:

    答案很简单,在运行时保留类型信息。

    列表可以充当数组,但数组不能充当列表。为什么你正在做的工作是因为你正在将一个数组转换为一个列表,并且如上所述,一个列表可以充当一个数组,所以这次你是安全的。

    但一般来说,强制转换是不好的做法。

    当你铸造一些东西时,你是在冒险,你基本上是在强迫编译器“信任你”你正在做的事情。所以不是编译器告诉你什么是对什么是错,你是在告诉编译器什么是对什么错,这是一种风险,破坏东西的风险。很难,因为如果您在运行时出错,我们可能会崩溃。艰难而无法控制。

    有很多意见的程序员很多,但只有一种意见的编译器,我们应该相信它。

    那么回到这个问题,ParameterizedTypeReference&lt;T&gt;.class 究竟做了什么?

    如果你查看它的构造函数,你会发现它就像一个类型信息的容器。通过执行new ParameterizedTypeReference&lt;List&lt;Foo.class&gt;&gt; {};,您正在实例化一个匿名类,同时传入一个类型。然后在构造函数中,它从传递的类型中提取类型信息并将其存储在内部。然后稍后我们可以通过getType() 来获取类型信息,这样我们就可以在运行时进行类型安全的“强制转换”。

        final ParameterizedTypeReference<List<String>> typeRef = new ParameterizedTypeReference<>() {};
        final Type type = typeRef.getType();
        final String typeName = type.getTypeName();
        System.out.println(typeName);
        // will print "java.util.List<java.lang.String>"
    

    这种模式称为“超级类型令牌”,您可以在此处阅读更多信息Neal Gafter's blog - Super Type Tokens

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2020-08-10
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      相关资源
      最近更新 更多