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 序列化机制,才能避免类似错误的发生。

Java 深拷贝 ArrayList 对象:解决 ClassCastException 错误

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

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