List<?> 类型的返回值,前端出问题吗?

当你在Java后端使用List<?>作为方法的返回值时,可能会导致前端出现一些问题。这是因为 List<?> 表示的是未知类型的列表,编译器无法确定列表中元素的具体类型。

在将这个列表传递给前端时,通常需要将其转换为JSON格式。然而,由于类型未知,序列化工具(如Jackson或Gson)可能无法正确地识别和处理列表中的元素。这可能导致以下问题:

类型信息丢失:
当你尝试将 List<?> 序列化为JSON时,序列化工具可能不会包含元素的类型信息。这意味着前端无法知道列表中元素的确切类型。 解析错误: 前端在接收到数据后,可能无法正确地解析 JSON 字符串,因为没有类型信息来指导解析过程。 安全性问题: 如果你的 List<?> 中包含了敏感信息,比如密码或其他不应公开的数据,而你在序列化时不加控制,那么这些信息可能会被暴露给前端。
为了避免这些问题,你可以采取以下措施:

明确类型参数:
尽量使用具体的类型参数,例如 List 或 List,而不是 List<?>。这样可以确保类型信息在序列化过程中得以保留。 类型检查: 在将元素添加到 List<?> 之前进行类型检查,确保它们具有正确的类型。这可以减少意外的类型转换错误。
自定义序列化:
使用自定义的序列化逻辑来处理 List<?>。这可能包括检查元素类型,并根据需要手动设置类型信息。 限制操作: 避免对 List<?> 进行写入操作,因为它可能会引发类型不匹配的问题。只允许读取操作可以降低出错的风险。
总之,虽然 List<?> 可以用于表示任意类型的列表,但在实际应用中它可能会带来一些问题。你应该尽量使用具体类型或者限制其用途,以确保类型安全和可维护性。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public List<SmokeArea> buildSmokeAreaTree(List<SmokeArea> smokeAreas){ List<SmokeArea> returnList = new ArrayList<>(); List<Long> tempList = smokeAreas.stream().map(SmokeArea::getAreaId).collect(Collectors.toList()); for(SmokeArea smokeArea : smokeAreas){ //如果顶级节点,遍历发该父节点的所有子节点 if (!tempList.contains(smokeArea.getParentId())){ recursionFn(smokeAreas,smokeArea); returnList.add(smokeArea); } } if (returnList.isEmpty()){ returnList = smokeAreas; } return returnList; } public List<TreeSelect> buildSmokeAreaTreeSelect(List<SmokeArea> smokeAreas){ List<SmokeArea> smokeAreaTrees = buildSmokeAreaTree(smokeAreas); return smokeAreaTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); } private void recursionFn(List<SmokeArea> list, SmokeArea smokeArea){ //得到子节点列表 List<SmokeArea> childList = getChildList(list,smokeArea); smokeArea.setChildren(childList); for (SmokeArea sChild : childList) { if (hasChild(list,sChild)){ recursionFn(list,sChild); } } } private List<SmokeArea> getChildList(List<SmokeArea> list ,SmokeArea smokeArea){ List<SmokeArea> slist = new ArrayList<>(); Iterator<SmokeArea> it = list.iterator(); while (it.hasNext()){ SmokeArea s = (SmokeArea) it.next(); if (StringUtils.isNotNull(s.getParentId()) && s.getParentId().longValue() == smokeArea.getAreaId().longValue()){ slist.add(s); } } return slist; } private boolean hasChild(List<SmokeArea> list, SmokeArea smokeArea){return getChildList(list,smokeArea).size() > 0;} 帮我解释一下这段代码
05-12
这段代码实现了将一组SmokeArea对象构建成树形结构的功能。其中SmokeArea是一个烟区对象,具有一个编号areaId和一个父节点编号parentId。该方法的输入参数是一个SmokeArea对象列表,输结果是一个树形结构的SmokeArea对象列表。具体实现过程如下: 1. 先创建一个空的返回结果列表 returnList,并创建一个 tempList,用于暂存所有SmokeArea对象的编号 areaId。 2. 遍历传入的 SmokeArea 列表 smokeAreas,对于每个SmokeArea对象,如果它的父节点编号 parentId 不在 tempList 中,则说明它是一个顶级节点,需要从它开始递归遍历其所有子节点。递归遍历的过程中,将每个遍历到的 SmokeArea 对象放入 returnList 中。 3. 如果 returnList 仍然是空的,则说明所有SmokeArea对象都是顶级节点,直接将 smokeAreas 赋值给 returnList。 4. 最后,将 returnList 中的 SmokeArea 对象转化为 TreeSelect 对象并返回。其中 TreeSelect 是一个树形结构的下拉列表对象,用于在前端页面中显示。 5. 递归遍历的具体实现是一个私有方法 recursionFn,它接收两个参数,一个是 SmokeArea 对象列表 list,另一个是当前正在递归遍历的 SmokeArea 对象 smokeArea。它的作用是找到 smokeArea 的所有子节点,并将它们放入 smokeArea 的 children 属性中。 6. 找到 smokeArea 的所有子节点的方法是 getChildList,它接收两个参数,一个是 SmokeArea 对象列表 list,另一个是当前正在递归遍历的 SmokeArea 对象 smokeArea。它的作用是从 list 中找到所有 parentId 等于 smokeArea 的 areaId 的 SmokeArea 对象,将它们放入一个列表中并返回。 7. 判断一个 SmokeArea 对象是否有子节点的方法是 hasChild,它接收两个参数,一个是 SmokeArea 对象列表 list,另一个是当前正在递归遍历的 SmokeArea 对象 smokeArea。它的作用是判断 getChildList(list, smokeArea) 的返回值列表的长度是否大于0,如果大于0,则说明 smokeArea 有子节点,否则没有子节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值