ClassCastException将List 转换为Class

我有一个方法,它有一个输入列表和每个输入值我必须将其转换为所需的类型。 (实际上这个列表有“some”forms的参数值,我应该转换成所需类型,所需类型是方法所需的类型,这是通过reflection调用api)

我写了这样的代码:

Type[] argTypes = method.getGenericParameterTypes(); List acutalValues = // List of actual values from method input. // Resultant list of arguments which will holds casted values. List arguments = new ArrayList(argTypes.length); for (int i = 0; i < argTypes.length; i++) { Class requiredClassTYpe = (Class) argTypes[i]; // argTypes[1] =java.util.List fails.. // cast the actual value to the required type. Required type is requiredClassType arguments.add(castToRequiredType(requiredClassTYpe, actualValues.get(i))); } 

exception消息是这样的:

 ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl (id=77) to java.lang.Class 

现在,如果我将第一行更改为

 Type[] argTypes = method.getParameterTypes() 

然后它传递任何想法为什么会这样发生?

因为如method.getGenericParameterTypes()所述,JavaDoc:

返回表示forms参数类型的Type对象数组

如果forms参数类型是参数化类型,则为其返回的Type对象必须准确反映源代码中使用的实际类型参数。

因此,如果您的方法声明如下:

 public void myMethod(String string, List list) { ... } 

argTypes[0]将包含Class实例(即Class ),但argTypes[1]将包含java.lang.reflect.ParameterizedType实例。 您可以使用getActualTypeArguments()方法获取有关ParameterizedType实际类型参数的信息。 上述案例I的示例:

 Type[] listTypeArgs = ((ParameterizedType) argTypes[1]).getActualTypeArguments() // listTypeArgs.length == 1 as List have one type argument // listTypeArgs[0] now contains instance of Class 

由于您的方法参数是参数化集合类型,因此getGenericParameterTypes返回ParameterizedType ,而不是Type 。 要获取实际类型,首先需要检查argTypes每个元素是否为ParameterizedType的实例,以及是否调用ParameterizedType.getActualTypeArguments()

话虽如此,我不知道你的代码试图做什么。 您的结果对象仍然是List ,因此当您从列表中获取元素时,您仍然必须将元素强制转换为正确的类型。 在将元素存储在列表中之前强制转换元素并不能完成任何事情。

 Type[] argTypes = method.getParamterTypes() 

我相信你在方法调用中缺少一个“e”,应该是getParameterTypes()