当试图获取泛型类型参数时



我想使用反射获得泛型实例:

        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()))

ClassParameterizedType是兄弟姐妹。兄弟不是姐妹,所以试图把他们彼此混为一谈是残忍的。

话虽这么说,快速解决问题的方法是要求客户端代码将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");
}

相关内容

  • 没有找到相关文章

最新更新