Java 11中如何判断entity和request是否为clazz指定的类型
问题解决:判断集合元素类型是否匹配指定Class
问题分析
你遇到的核心问题是搞错了判断对象:传入的entity是Hibernate的PersistentBag(List的实现类)、request是JDK的LinkedList,二者都是集合容器,而你要判断的是集合里的元素是否属于ContattoCliente.class,不是判断容器本身的类型。之前的equals和getClass()比较都是在拿容器对象和Class对象/目标类比较,自然永远不成立。
正确判断逻辑
- 先判断
entity和request是否为List类型(因为二者都是List的实现类) - 再检查集合中的元素是否属于指定的
clazz类型,用clazz.isInstance(element)方法(这是判断对象是否为某类实例的标准方式)
修改后的代码示例
private Object convertMapMergedToEntity(Object entity, Object request, Class<?> clazz) { List<Object> resultList = new ArrayList<>(); Object clienteMerged = new Object(); ObjectMapper mapper = JsonMapper.builder().addModule(new JavaTimeModule()).build(); // 处理ContattoCliente集合的情况:先判断容器是List,再验证元素类型 if (clazz == ContattoCliente.class && entity instanceof List && request instanceof List) { List<?> entityList = (List<?>) entity; List<?> requestList = (List<?>) request; // 可选:验证集合非空且第一个元素是目标类型(避免空指针或类型不匹配) if (!entityList.isEmpty() && clazz.isInstance(entityList.get(0)) && !requestList.isEmpty() && clazz.isInstance(requestList.get(0))) { for (int i = 0; i < requestList.size(); i++) { Object contattoMerged = new Object(); LinkedHashMap<Object, Object> entityMap = mapper.convertValue(entityList.get(i), LinkedHashMap.class); LinkedHashMap<Object, Object> requestMap = mapper.convertValue(requestList.get(i), LinkedHashMap.class); contattoMerged = mapDifferenceMerged2(entityMap, requestMap, clazz); resultList.add(contattoMerged); } return resultList; } } // 处理Cliente单个对象的情况 else if (clazz == Cliente.class && clazz.isInstance(entity) && clazz.isInstance(request)) { LinkedHashMap<Object, Object> entityMap = mapper.convertValue(entity, LinkedHashMap.class); LinkedHashMap<Object, Object> requestMap = mapper.convertValue(request, LinkedHashMap.class); clienteMerged = mapDifferenceMerged2(entityMap, requestMap, clazz); } return clienteMerged; }
关键知识点说明
instanceof:用于判断对象是否为某个类/接口的实例(包括子类实现),比如entity instanceof List能匹配所有List的实现类(PersistentBag、LinkedList都满足)clazz.isInstance(element):等价于element instanceof clazz,但适合通过Class对象动态判断的场景- 不要用
getClass() == clazz:这种方式只能精确匹配类类型,无法匹配子类/实现类,而且这里你要判断的是集合元素,不是集合本身
内容的提问来源于stack exchange,提问作者Cheps
相关产品推荐
相关产品推荐

