Java RestTemplate获取对象列表-为什么使用ParameteredTypeReference而不是对象数组?

Java RestTemplate获取对象列表-为什么使用ParameteredTypeReference而不是对象数组?,java,arrays,spring,arraylist,resttemplate,Java,Arrays,Spring,Arraylist,Resttemplate,我正在尝试使用SpringRESTTemplate获取对象列表。我不明白为什么选择ParameterizedTypeReference方法来使用restTemplate而不是仅仅使用Object[].class来获取对象列表 我检查了多个建议使用参数化TypeReference的答案。但是为什么我不能只使用Object[].class呢?我有什么限制 我已经检查了这个链接(),它说,我只能在简单的情况下使用Object[],并且在处理复杂的json结构时必须使用参数化TypeReference。

我正在尝试使用SpringRESTTemplate获取对象列表。我不明白为什么选择ParameterizedTypeReference方法来使用restTemplate而不是仅仅使用Object[].class来获取对象列表

我检查了多个建议使用参数化TypeReference的答案。但是为什么我不能只使用Object[].class呢?我有什么限制

我已经检查了这个链接(),它说,我只能在简单的情况下使用Object[],并且在处理复杂的json结构时必须使用参数化TypeReference。有人能解释一下在什么情况下我不能使用Object[]方法吗

参数化类型参考方法:

ResponseEntity<List<Rating>> responseEntity =
                restTemplate.exchange("http://localhost:8084/ratingsdata/user/" + userId,
                        HttpMethod.GET, null, new ParameterizedTypeReference<List<Rating>>() {
                        });
List<Rating> ratings = responseEntity.getBody();
List<Rating> ratings = Arrays.asList(restTemplate.getForObject("http://localhost:8084/ratingsdata/user/"+userId, Rating[].class));
ResponseEntity ResponseEntity=
restTemplate.exchange(“http://localhost:8084/ratingsdata/user/“+userId,
HttpMethod.GET,null,新参数化类型引用(){
});
列表评级=responseEntity.getBody();
对象[]方法:

ResponseEntity<List<Rating>> responseEntity =
                restTemplate.exchange("http://localhost:8084/ratingsdata/user/" + userId,
                        HttpMethod.GET, null, new ParameterizedTypeReference<List<Rating>>() {
                        });
List<Rating> ratings = responseEntity.getBody();
List<Rating> ratings = Arrays.asList(restTemplate.getForObject("http://localhost:8084/ratingsdata/user/"+userId, Rating[].class));
List ratings=Arrays.asList(restTemplate.getForObject(“http://localhost:8084/ratingsdata/user/“+userId,评级[].class]);

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

列表可以用作数组,但数组不能用作列表。您所做的工作之所以有效,是因为您正在将一个数组强制转换为一个列表,并且如上所述,一个列表可以充当一个数组,所以这次您是安全的

但一般来说,铸造是一种糟糕的做法

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

有很多程序员有很多观点,但是只有一个编译器有一个观点,我们应该相信它

回到问题上来,
ParameterizedTypeReference.class
实际上做什么

如果你查看它的构造器,你会发现它在类型信息上就像一个容器。通过执行
newparametedtypereference{}传入类型时正在实例化匿名类。然后在构造函数中,它从传递的类型中提取类型信息并将其存储在内部。然后,稍后我们可以执行
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>"
final ParameteredTypeReference typeRef=新的ParameteredTypeReference(){};
final Type=typeRef.getType();
最后一个字符串typeName=type.getTypeName();
System.out.println(typeName);
//将打印“java.util.List”
这个模式被称为“超级类型令牌”,您可以在这里阅读更多关于它的内容