Java 深拷贝 ArrayList 对象:解决 ClassCastException 错误
Java 深拷贝 ArrayList 对象:解决 ClassCastException 错误
在 Java 中,使用序列化实现深拷贝 ArrayList 对象是一种常见的做法。然而,在实际应用中,可能会遇到 java.lang.ClassCastException 错误,例如:
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:1145)
at com.rcqt.server.GM.lambda$checkIsUploadAndUpdateFileTrain$0(GM.java:919)
at java.base/java.lang.Thread.run(Thread.java:833)
这个错误是因为你尝试将一个 ArrayList 对象转换为 DetailRouteMapData 对象,但是类型不匹配导致的。
在你的代码中,你将原始列表对象写入字节数组输出流,然后再从字节数组输入流中读取对象。但是你只读取了一个对象,并尝试将其转换为 DetailRouteMapData 类型。
解决方法
在读取对象时,使用一个循环来读取所有的对象,并将它们添加到复制列表中。修改你的代码如下:
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
List<DetailRouteMapData> copiedList = new ArrayList<>();
while (true) {
try {
copiedList.add((DetailRouteMapData) in.readObject());
} catch (EOFException e) {
break; // 读取完所有对象后退出循环
}
}
in.close();
return copiedList;
这样,你将能够正确地将原始列表中的所有对象复制到新的列表中。
总结
通过使用循环读取所有对象并进行类型转换,可以解决深拷贝 ArrayList 对象时出现的 ClassCastException 错误。确保你正确地理解深拷贝的原理和 Java 序列化机制,才能避免类似错误的发生。
原文地址: https://www.cveoy.top/t/topic/quyA 著作权归作者所有。请勿转载和采集!