如何获取参数化类型的类引用

时间:2015-02-24 11:56:09

标签: java generics reflection

是否有机会为类引用分配参数化类型,例如

    Class<Set>  c1= Set.class;   //OK
    Class<Set<Integer>> c2 = Set<Integer>.class; //Makes error

3 个答案:

答案 0 :(得分:2)

你不能这样做,因为类型参数信息在运行时消失了,然后实际评估了.class语句。

你只能这样做:

Set<Integer> someSet = ..
Class<?> c2 = someSet.class;

答案 1 :(得分:2)

.class字面值与类名称一起使用,或在对象上调用getClass()方法返回Class实例,对于任何类,只有一个Class List<T>与之相关的实例。

同样适用于泛型类型。类List.class只有一个类实例,即C++。对于不同的类型参数,不会有不同的类类型。这类似于Class如何实现泛型,其中每个泛型类型实例化将具有单独的Set<Integer>.class实例。所以在Java中,你不能Class。 Java并不允许这样做,因为它没有意义,并且可能对Class<Set<Integer>>个实例的数量提出错误的意图。

但是,如果你想要Class<Set<Integer>> clazz = (Class<Set<Integer>>)(Class<?>) Set.class; ,你可以实现一点类型转换(这将是安全的),如下所示:

{{1}}

这将完美无缺。

答案 2 :(得分:0)

new ParameterizedTypeReference<List<ClassName>>() {} Should work.

以下是交换方法Rest Template类交换功能的示例

功能要求

public <T> ResponseEntity<T> exchange(URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType) throws RestClientException 

实施

restTemplate.exchange(new URI("Http://{host}:{port}/{url}"), HttpMethod.POST, customObject, new ParameterizedTypeReference<List<ResponseClassName>>() {});