问题描述:
List使用Arrays.asList()初始化后,再add对象时报错:
Method threw 'java.lang.UnsupportedOperationException' exception.
错误示例如下:
List<ExportListVO.ExportSheet> sheetVOList = Arrays.asList(
new ExportListVO.ExportSheet("导出合价",0L,1),
new ExportListVO.ExportSheet("导出工料机",0L,2),
new ExportListVO.ExportSheet("导出造价经济指标",0L,3));
for (TbProjectStructure iVO : structureList) {
ExportListVO.ExportSheet sheetVO = new ExportListVO.ExportSheet();
sheetVO.setId(iVO.getProjectId());
sheetVO.setName(iVO.getName() + "-造价汇总");
sheetVO.setSheetType(5);
sheetVOList.add(sheetVO);
}
sheetVOList.add(new ExportListVO.ExportSheet("导出分类经济指标",0L,4));
projectVo.setSheetList(sheetVOList);
newList.add(projectVo);
问题:
以上代码第10行执行时add报错;
原因:
Arrays.asList()返回的 List<> 与 new ArrayList<>() 不是一个类型,缺少泛型结构;
new ArrayList<>()底层是重写了 Arrays.asList();
因此,集合的方法在 Arrays.asList() 里是没有的。
正确示例如下:
List<ExportListVO.ExportSheet> sheetVOList = new ArrayList<>(Arrays.asList(
new ExportListVO.ExportSheet("导出合价",0L,1),
new ExportListVO.ExportSheet("导出工料机",0L,2),
new ExportListVO.ExportSheet("导出造价经济指标",0L,3)));
for (TbProjectStructure iVO : structureList) {
ExportListVO.ExportSheet sheetVO = new ExportListVO.ExportSheet();
sheetVO.setId(iVO.getProjectId());
sheetVO.setName(iVO.getName() + "-造价汇总");
sheetVO.setSheetType(5);
sheetVOList.add(sheetVO);
}
sheetVOList.add(new ExportListVO.ExportSheet("导出分类经济指标",0L,4));
projectVo.setSheetList(sheetVOList);
newList.add(projectVo);
解决办法:
1.办法很简单,再套一层即可,如下:
new ArrayList<>(Arrays.asList());
2.深拷贝 ArrayList,如下:
Lits<String>list = new ArrayList();
Lits<String>list2 = new ArrayList(list );
3.也可以使用,如下:
Lits<String>list1 = new ArrayList();
Lits<String>list2 = new ArrayList();
list2.addAll(list1)
如果本篇文章对你有帮助的话,很高兴能够帮助上你。
当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。