Java 深拷贝 ArrayList: 避免 ClassCastException 错误

在进行 ArrayList 深拷贝时,可能会出现以下错误:

Exception in thread "Thread-503" java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class com.rcqt.server.bean.DetailRouteMapData (java.util.ArrayList is in module java.base of loader 'bootstrap'; com.rcqt.server.bean.DetailRouteMapData is in unnamed module of loader 'app')
	at com.rcqt.server.GM.deepCopy(GM.java:1148)
	at com.rcqt.server.GM.lambda$checkIsUploadAndUpdateFileTrain$0(GM.java:919)
	at java.base/java.lang.Thread.run(Thread.java:833)

该错误是由于在进行深拷贝时,尝试将一个 ArrayList 对象强制转换为 DetailRouteMapData 对象引起的。

解决方案:

要解决这个问题,需要修改代码中的深拷贝逻辑。可以使用循环遍历原始列表,并逐个将元素拷贝到新的列表中。

以下是修改后的代码示例:

private List<DetailRouteMapData> deepCopy(List<DetailRouteMapData> originalList) throws IOException, ClassNotFoundException {
    List<DetailRouteMapData> copiedList = new ArrayList<>();
    
    for (DetailRouteMapData originalData : originalList) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(bos);
        out.writeObject(originalData);
        out.flush();
        out.close();
        
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream in = new ObjectInputStream(bis);
        copiedList.add((DetailRouteMapData) in.readObject());
        in.close();
    }
    
    return copiedList;
}

这样修改后,每个元素都会被单独拷贝到新的列表中,避免了类型转换错误。

总结

在进行深拷贝时,如果要拷贝的对象是 ArrayList 类型的,应该逐个将元素拷贝到新的 ArrayList 中,而不是直接将整个 ArrayList 对象进行拷贝,以避免 ClassCastException 错误。

Java 深拷贝 ArrayList: 避免 ClassCastException 错误

原文地址: https://www.cveoy.top/t/topic/quyX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录