Exception in thread "main" java.lang.ClassCastException: com.itzhimei.base.lambda.Person cannot be cast to java.lang.String
at java.text.Collator.compare(Collator.java:304)
at com.itzhimei.base.lambda.ComparatorTest2$1.compare(ComparatorTest2.java:41)
at com.itzhimei.base.lambda.ComparatorTest2$1.compare(ComparatorTest2.java:37)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
at java.util.TimSort.sort(TimSort.java:220)
at java.util.Arrays.sort(Arrays.java:1438)
at java.util.Arrays$ArrayList.sort(Arrays.java:3895)
at com.itzhimei.base.lambda.ComparatorTest2.main(ComparatorTest2.java:37)
代码:
Person p1 = new Person();
p1.setAge(20);
p1.setName("张三");
Person p2 = new Person();
p2.setAge(20);
p2.setName("李四");
List<Person> personList = Arrays.asList(p1, p2);
personList.sort((o1, o2) -> {
return instance.compare(o1,o2);
});
原因
重点代码在这里:
return instance.compare(o1,o2);
使用compare方法进行比较,有两个方法如下:
public abstract int compare(String source, String target);
public int compare(Object o1, Object o2) {
return compare((String)o1, (String)o2);
}
不管是直接的String参数方法,还是使用对象做参数的方法,最终比较的都是String类型,我们的代码传入的参数是两个对象,使用的是第二个方法,类型强转无法转换就报错了。
解决:
1、Person类重写toString,调用compare这样写:
return instance.compare(o1.toString(),o2.toString());
2、调用compare直接使用Person对象对应的String属性进行对比:
return instance.compare(o1.getName(),o2.getName());