报错信息:java.lang.ClassCastException: xxx cannot be cast to java.lang.Comparable
1. 问题重现
以下为伪代码:
// 获取的List对象集合 List<SomeRes> someResList = service.getSomeResList(); // 要放入的Set集合 Set<SomeRes> someResSet = null; for (SomeRes res : someResList ) { someResSet = new TreeSet<>(); someResSet.add(res); }
原因分析:
第一次添加元素时,因为TreeSet或者TreeMap对象为空,不需要比较,不会报错。但是当第二次放入元素时,TreeSet或者TreeMap为了确保对象有序的就必须比较,这个时候发现这两个对象根本无法比较,则抛出该异常错误。实际上在new TreeSet<>();
时idea已经提示(Construction of sorted collection with non-comparable elements 构造具有非可比元素的排序集合)
。
2. 问题解决
非可排序的类实现 Comparable 接口,并重写 compareTo 方法:
public class SomeRes implements Comparable<SomeRes> { @ApiModelProperty(value = "设备ID") @JsonProperty(value = "equip") private String equip; @ApiModelProperty(value = "车牌号") @JsonProperty(value = "car_number") private String carNumber; @Override public int compareTo(@NotNull SomeRes o) { return this.carNumber.compareTo(o.carNumber); } }