删除用户接口出现ClassCastException:LinkedHashMap无法转为User类
问题分析与解决
问题根源
报错java.lang.ClassCastException: LinkedHashMap cannot be cast to User的核心原因是:getUsers()方法返回的List<User>集合中,实际存储的是LinkedHashMap对象而非User实例。当调用removeIf遍历集合时,JVM尝试将集合元素强制转换为User类型,触发类型转换异常。
这种情况通常出现在通过JSON反序列化获取集合时,没有正确指定泛型类型,导致序列化工具(如Jackson)默认将JSON对象转换为LinkedHashMap,而非目标实体类User。
解决步骤
1. 修复getUsers()方法的反序列化逻辑
假设getUsers()是从JSON文件或字符串读取数据,检查是否存在以下错误写法:
// 错误写法:未指定泛型类型,导致反序列化为List<LinkedHashMap> ObjectMapper mapper = new ObjectMapper(); List<User> users = mapper.readValue(jsonSource, List.class);
修改为指定泛型的正确写法:
// 方法1:使用TypeReference指定泛型 ObjectMapper mapper = new ObjectMapper(); List<User> users = mapper.readValue(jsonSource, new TypeReference<List<User>>() {}); // 方法2:使用JavaType构造集合类型 JavaType listType = mapper.getTypeFactory().constructCollectionType(List.class, User.class); List<User> users = mapper.readValue(jsonSource, listType);
2. 验证集合元素类型(调试用)
可以在deleteUser方法中添加临时调试代码,确认集合元素的实际类型:
public void deleteUser(int userId) throws IOException { List<User> users = getUsers(); // 调试:打印每个元素的类型 for (Object obj : users) { System.out.println("元素类型:" + obj.getClass().getName()); } users.removeIf(user -> user.getUserId() == userId); saveUsers(users); }
3. 其他场景排查
如果getUsers()的数据来源是缓存、第三方接口或其他序列化场景,同样需要确保反序列化时明确指定目标类型User,避免因类型擦除导致的类型转换错误。
内容的提问来源于stack exchange,提问作者lse23
相关产品推荐
相关产品推荐

