如何获得对参数化类型的 class 引用
how to get a class reference to parameterized type
是否有机会分配给 class 引用参数化类型,例如
Class<Set> c1= Set.class; //OK
Class<Set<Integer>> c2 = Set<Integer>.class; //Makes error
你不能这样做,因为类型参数信息在运行时消失了,然后 .class
语句实际上被评估了。
你只能做:
Set<Integer> someSet = ..
Class<?> c2 = someSet.class;
使用带有 class 名称的 .class
文字,或在对象 returns Class
实例上调用 getClass()
方法,对于任何 class 只有一个 Class
实例与之关联。
通用类型也是如此。 class List<T>
只有一个 class 实例,即 List.class
。不同的类型参数不会有不同的 class 类型。这类似于 C++
实现泛型的方式,其中每个泛型类型实例化将有一个单独的 Class
实例。所以在Java,你不能做Set<Integer>.class
。 Java 不允许这样做,因为它没有意义,并且可能会给出关于 Class
实例数量的错误意图。
但是,如果你想要一个 Class<Set<Integer>>
,你可以实现一点类型转换(这将是安全的),如下所示:
Class<Set<Integer>> clazz = (Class<Set<Integer>>)(Class<?>) Set.class;
这会很好用。
new ParameterizedTypeReference<List<ClassName>>() {} Should work.
下面给出了交换方法 Rest 模板的示例 class 交换函数
功能要求
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>>() {});
是否有机会分配给 class 引用参数化类型,例如
Class<Set> c1= Set.class; //OK
Class<Set<Integer>> c2 = Set<Integer>.class; //Makes error
你不能这样做,因为类型参数信息在运行时消失了,然后 .class
语句实际上被评估了。
你只能做:
Set<Integer> someSet = ..
Class<?> c2 = someSet.class;
使用带有 class 名称的 .class
文字,或在对象 returns Class
实例上调用 getClass()
方法,对于任何 class 只有一个 Class
实例与之关联。
通用类型也是如此。 class List<T>
只有一个 class 实例,即 List.class
。不同的类型参数不会有不同的 class 类型。这类似于 C++
实现泛型的方式,其中每个泛型类型实例化将有一个单独的 Class
实例。所以在Java,你不能做Set<Integer>.class
。 Java 不允许这样做,因为它没有意义,并且可能会给出关于 Class
实例数量的错误意图。
但是,如果你想要一个 Class<Set<Integer>>
,你可以实现一点类型转换(这将是安全的),如下所示:
Class<Set<Integer>> clazz = (Class<Set<Integer>>)(Class<?>) Set.class;
这会很好用。
new ParameterizedTypeReference<List<ClassName>>() {} Should work.
下面给出了交换方法 Rest 模板的示例 class 交换函数
功能要求
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>>() {});