1、范型的定义
泛型就是指明集合中存储数据的类型。如果没有指明数据类型,那集合可以存储任意类型,就会存在上述提到的类型转换异常的安全隐患。
2、范型的使用(根据单个属性值来的)
- 例如现在我们要使用同一个方法,但是要传入list,但是里面的对象不同,我们应该如何处理呢?
@Override
public List<FolderVo> findLeftTrees(String caseOrderNo, Integer caseType) throws Exception {
if (StringUtils.isBlank(caseOrderNo)) {
throw new BusinessErrorException(BusinessMsgEnum.PARAM_EMPTY.code(), "案件流水号为空");
}
if (caseType == null) {
CaseInfo caseInfo = caseInfoMapper.selectByPrimaryKey(caseOrderNo);
if (caseInfo == null || caseInfo.getCaseType() == null) {
throw new BusinessErrorException(BusinessMsgEnum.PARAM_EMPTY.code(), "案件类型为空");
}
caseType = caseInfo.getCaseType();
}
//1. 查询t_dossier_cfg表中的目录配置信息
List<DossierCfg> dossierCfgList = dossierCfgMapper.findDossierCfg(caseType);
//2. 根据案件id,查询t_evidence表中的目录和文件信息
List<Evidence> evidenceList = evidenceMapper.findEvidenceByCaseOrderNo(caseOrderNo);
evidenceList = evidenceList.stream().filter(evidence -> StringUtils.isNotBlank(evidence.getParentCode())).collect(Collectors.toList());
//3. 合并所有的文件和目录信息结构
List<FolderVo> folderVoList = mergeFolder(dossierCfgList, evidenceList);
//4. 递归合并文件夹
folderVoList = TreeUtil.getTree(folderVoList, "folderCode", "0", "parentCode", "children");
return folderVoList;
}
@Override
public List<SysRespondentVo> getSysRespondentTree() throws Exception {
SysRespondentQo qo = new SysRespondentQo();
qo.setIsDelete(ConstantNum.N0);
List<SysRespondent> list = sysRespondentMapper.selectInfo(qo);
List<SysRespondentVo> listVo = new ArrayList<>();
for (SysRespondent re : list) {
SysRespondentVo vo = new SysRespondentVo(re);
listVo.add(vo);
}
listVo = TreeUtil.getTree(listVo, "id", "0", "parentRespondent", "childList");
return listVo;
}
/**
* 把列表转换为树结构
*
* @param originalList 原始list数据
* @param keyName 作为唯一标示的字段名称
* @param region 根节点终结标识
* @param parentFieldName 父节点字段名
* @param childrenFieldName 子节点字段名
* @return 组装后的集合
*/
public static <T> List<T> getTree(List<T> originalList, String keyName, String region, String parentFieldName, String childrenFieldName) throws Exception {
// 获取根节点
List<T> topList = new ArrayList<>();
Iterator<T> iterator = originalList.iterator();
while (iterator.hasNext()) {
T t = iterator.next();
String parentId = BeanUtils.getProperty(t, parentFieldName);
if (parentId.equals(region)) {
topList.add(t);
iterator.remove();
}
}
// 递归封装树
fillTree(topList, originalList, keyName, parentFieldName, childrenFieldName);
return topList;
}
这里如果只在方法里面些LIst<任意类型T>,上面两个方法会提示参数类型错误,这里如果要使用范型,返回值必须是<任意类型T> List<任意类型>类型的就不会报错。
3、使用泛型来接收对象
这里利用反射来实现对象的实例化,从而得到具体的对象实例。