尝试获取泛型类型参数时出现ClassCastException

时间:2015-05-31 12:28:21

标签: java generics reflection

我想使用反射来获取泛型的实例:

        this.wrapperInstance = ((Class<WRAPPER>) ((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[1]).newInstance();

但我得到例外:

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

}

在google中,我发现大多数情况都像春天一样,在这里我不使用spring,所以也许有任何明确的解决方案可以解决这个问题。

3 个答案:

答案 0 :(得分:2)

  

不知道哪里有问题,也许有人可以帮助我

错误消息是不言自明的。以下语句返回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
}

答案 1 :(得分:0)

您期望结果如何?

为简化您的问题,可以说您有以下课程:

class XMLUtils extends java.lang.Object {
  public XMLUtils() {
      getClass().getGenericSuperclass()// == java.lang.Object
  }
}

现在您正在尝试将java.lang.Object转换为ParameterizedType,但这仅适用于类是泛型类的情况。因此它失败了......

答案 2 :(得分:0)

您可能需要使用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");
}