Java compare方法比较时,报错:xxx cannot be cast to java.lang.String

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());