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

标签 java generics reflection

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

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

}

在谷歌中,我发现大多数类似的情况,但是对于 spring,这里我没有使用 spring,所以也许有任何明确的解决方案来解决我想要做的事情。

最佳答案

Do not know where is problem, maybe someaone can help me

错误消息是不言自明的。以下语句返回一个 Class :

(getClass().getGenericSuperclass())

并且您正尝试将其转换为ParameterizedType

((ParameterizedType) (getClass().getGenericSuperclass()))

ClassParameterizedType 是 sibling 。兄弟不是姐妹,所以试图将他们强加给彼此是残酷的。

话虽如此,问题的快速解决方案是要求客户端代码将 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
}

关于java - 尝试获取泛型类型参数时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30557421/

相关文章:

c# - 为什么 C# 编译器允许在 IEnumerable<T> 和 TAlmostAnything 之间进行显式转换?

.net - System.Reflection.TargetInvocationException 未被捕获

c# - 反射泛型列表类型的属性

java - java java.lang.reflect.Field 的用例?

java - 如何删除许多 If block

Java 类加载器教程

java - 无法使用 OpenCV 打开/查看/抓取/读取 IP 摄像头

java - 我在 Windows 中输入 mvn 命令,但命令行返回一个 java 提示

generics - Ada:具有可变大小数组属性的对象

c++ - 如何动态设置类型?