在GenericService中创建了一个通用方法:
public <E> ResponseEntity<List<E>> get(String url) throws RestClientException, NotAuthenticatedException {
ResponseEntity<List<E>> l = getClient().template().exchange(getClient().apiUrl(url), HttpMethod.GET, null,
new ParameterizedTypeReference<List<E>>() {
});
return l;
}
...
ResponseEntity<List<NotificationDTO>> result = get(url);
List result.getBody(); //<--debug point
但它始终将没有参数化项目的List添加到E,这应该是调试点的NotificationDTO列表,
有人可以告诉或建议为什么ParameterizedTypeReference:53没有提供正确的类型吗?
答案 0 :(得分:2)
这是由 type erasure 引起的。
在编译时,所有泛型类型信息都会被检查,删除,因此在运行时不可用。
维基百科上的Problems with type erasure部分可能有助于更好地理解它。
答案 1 :(得分:2)
类型标记 hack (ParameterizedTypeReference
)通过在源代码中返回在编译时提供给它的实际类型参数来工作。在你的情况下,那是
new ParameterizedTypeReference<List<E>>()
换句话说,它是List<E>
。由于杰克逊或您使用的任何解串器不知道E
是什么,它使用其默认类型。
无法使用类型变量动态使用类型标记。使用具体类型。