Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取参数化类型的类引用_Java_Generics_Reflection - Fatal编程技术网

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

Java 如何获取参数化类型的类引用,java,generics,reflection,Java,Generics,Reflection,是否有机会将参数化类型例如分配给类引用 Class<Set> c1= Set.class; //OK Class<Set<Integer>> c2 = Set<Integer>.class; //Makes error Class c1=Set.Class//好啊 类别c2=集合类别//出错 您不能这样做,因为类型参数信息在运行时消失,而.class语句实际上在运行时被计算 您只能执行以下操作: Set<Integer

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

    Class<Set>  c1= Set.class;   //OK
    Class<Set<Integer>> c2 = Set<Integer>.class; //Makes error
Class c1=Set.Class//好啊
类别c2=集合类别//出错

您不能这样做,因为类型参数信息在运行时消失,而
.class
语句实际上在运行时被计算

您只能执行以下操作:

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

使用带有类名的
.class
文本,或在对象上调用
getClass()
方法返回
实例,对于任何类,都有一个且只有一个与其关联的
实例

对于泛型类型也是如此。类
List
只有一个类实例,即
List.class
。对于不同的类型参数,不会有不同的类类型。这类似于
C++
实现泛型的方式,其中每个泛型类型实例化将有一个单独的
实例。因此,在Java中,不能执行
Set.class
。Java不允许这样做,因为这样做毫无意义,而且可能会给出有关
实例数量的错误意图

但是,如果您想要一个
,您可以通过一些类型转换(这将是安全的),如下所示:

Class<Set<Integer>> clazz = (Class<Set<Integer>>)(Class<?>) Set.class;
Class clazz=(Class)(Class)Set.Class;
这将很好地工作。

新的ParameterizedTypeReference(){}应该可以工作。
new ParameterizedTypeReference<List<ClassName>>() {} Should work.
下面给出了交换方法Rest模板类交换函数的示例

功能要求

public <T> ResponseEntity<T> exchange(URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType) throws RestClientException 
public ResponseEntity交换(URI url,HttpMethod方法,@Nullable HttpEntity requestEntity,ParameterizedTypeReference responseType)抛出RestClientException
实施

restTemplate.exchange(new URI("Http://{host}:{port}/{url}"), HttpMethod.POST, customObject, new ParameterizedTypeReference<List<ResponseClassName>>() {});
restemplate.exchange(新URI(“Http://{host}:{port}/{url}”)、HttpMethod.POST、customObject、新的ParameterizeTypeReference(){});
非常感谢。我理解“类型擦除”和反射,但我不知道如何消除恼人的类型安全警告(例如,当动态调用的方法返回参数化类型时)。现在我知道了:-)