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 extends String>
),但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 extends String>
由于您的方法参数是参数化集合类型,因此getGenericParameterTypes
返回ParameterizedType
,而不是Type
。 要获取实际类型,首先需要检查argTypes
每个元素是否为ParameterizedType
的实例,以及是否调用ParameterizedType.getActualTypeArguments()
。
话虽如此,我不知道你的代码试图做什么。 您的结果对象仍然是List
,因此当您从列表中获取元素时,您仍然必须将元素强制转换为正确的类型。 在将元素存储在列表中之前强制转换元素并不能完成任何事情。
Type[] argTypes = method.getParamterTypes()
我相信你在方法调用中缺少一个“e”,应该是getParameterTypes()
- 这有什么不对? 我得到一个java.lang.ClassCastException错误,但我看不出我出错的地方
- 引起:java.lang.ClassCastException:java.sql.Timestamp无法强制转换为java.sql.Date
- Javagenerics中不会抛出ClassCastException
- generics,数组和ClassCastException
- Android java.lang.ClassCastException:android.widget.RelativeLayout无法强制转换为android.widget.EditText
- ClassCastException与“无法强制转换”编译错误
- java.lang.ClassCastException的含义:someClass与someClass不兼容
- 如何构建同一个加载不同类加载器的两个实例?
- 在进行通用转换时,在generics方法中捕获ClassCastException