Java 深拷贝 ArrayList: 避免 ClassCastException 错误
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 错误。
原文地址: https://www.cveoy.top/t/topic/quyX 著作权归作者所有。请勿转载和采集!