返回没有参数化参数的通用列表

时间:2014-11-12 14:44:07

标签: java spring rest generics casting

在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没有提供正确的类型吗?

2 个答案:

答案 0 :(得分:2)

这是由 type erasure 引起的。

在编译时,所有泛型类型信息都会被检查,删除,因此在运行时不可用。

维基百科上的Problems with type erasure部分可能有助于更好地理解它。

答案 1 :(得分:2)

类型标记 hack ParameterizedTypeReference)通过在源代码中返回在编译时提供给它的实际类型参数来工作。在你的情况下,那是

new ParameterizedTypeReference<List<E>>()

换句话说,它是List<E>。由于杰克逊或您使用的任何解串器不知道E是什么,它使用其默认类型。

无法使用类型变量动态使用类型标记。使用具体类型。