我想使用反射获得泛型实例:
this.wrapperInstance = ((Class<WRAPPER>) ((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[1]).newInstance();
但是我得到exception:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
不知道问题出在哪里,也许有人能帮助我?有完整的类代码:
public class XMLUtils<MODEL extends AbstractModel, WRAPPER extends WraperInterface<MODEL>> {
private WRAPPER wrapperInstance;
@SuppressWarnings("unchecked")
public XMLUtils() throws InstantiationException, IllegalAccessException {
this.wrapperInstance = ((Class<WRAPPER>) ((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[1]).newInstance();
}
@SuppressWarnings("unchecked")
public List<MODEL> loadDataFromXML(String fileName) {
try {
File pajamuFile = new File(
UserDataLoader.INSTANCE.getCurrentUserFolder() + fileName);
JAXBContext context = JAXBContext.newInstance(wrapperInstance.getClass());
Unmarshaller um = context.createUnmarshaller();
WRAPPER wrapper = (WRAPPER) um.unmarshal(pajamuFile);
return wrapper.getDataList();
} catch (JAXBException e) {
e.printStackTrace();
return new ArrayList<MODEL>();
}
}
public void saveDataToXML(List<MODEL> dataList, String fileName) {
try {
File pajamuFile = new File(
UserDataLoader.INSTANCE.getCurrentUserFolder() + fileName);
JAXBContext context = JAXBContext.newInstance(wrapperInstance.getClass());
Marshaller m = context.createMarshaller();
WRAPPER wrapper = wrapperInstance;
wrapper.setDataList(dataList);
m.marshal(wrapper, pajamuFile);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
在谷歌我发现大多数这样的情况,但与春天,在这里我不使用春天,所以也许有任何明确的解决方案,我想做的。
不知道问题出在哪里,也许有人能帮我一下
错误信息是不言自明的。下面的语句返回一个Class
:
(getClass().getGenericSuperclass())
你试图将其转换为ParameterizedType
((ParameterizedType) (getClass().getGenericSuperclass()))
Class
和ParameterizedType
是兄弟姐妹。兄弟不是姐妹,所以试图把他们彼此混为一谈是残忍的。
话虽这么说,快速解决问题的方法是要求客户端代码将Class
类型传递给XmlUtils
类。
public class XMLUtils<MODEL extends AbstractModel, WRAPPER extends WraperInterface<MODEL>> {
private WRAPPER wrapperInstance;
public XMLUtils(Class<WRAPPER> wrapperInstance) throws InstantiationException, IllegalAccessException {
this.wrapperInstance = wrapperInstance
}
//more code follows
}
你期望的结果是什么?
为了简化你的问题,你可以说你有以下类:
class XMLUtils extends java.lang.Object {
public XMLUtils() {
getClass().getGenericSuperclass()// == java.lang.Object
}
}
现在你正试图将java.lang.Object
转换为ParameterizedType
,但这只会在类是泛型类的情况下起作用。
您可能需要使用TypeVariable
而不是ParameterizedType
。
您检查了从getClass().getGenericSuperclass()
返回的对象的类型吗?例如
Class<?> c = getClass().getGenericSuperclass();
if (c instanceof ParameterizedType) {
System.out.println("It is an instanceof ParameterizedType");
}
else if (c instanceof TypeVariable) {
System.out.println("It is an instanceof TypeVariable");
}
else {
System.out.println("It is something else");
}