首先是Customer类定义:
然后是CustomerComparator类定义:
实例化对象: TreeSet<Customer> set=new TreeSet<Customer>(new CustomerComparator());
如果改成:
TreeSet<customer> set=new TreeSet<customer>();
在 set.add(c1);语句时报错误:
Exception in thread "main" java.lang.ClassCastException: com.lzw.Customer cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1290)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at com.lzw.CustomerComparator.main(CustomerComparator.java:24)
问题:1、请问为什么会这样?2、TreeSet的集合元素是Customer对象,我也在Customer类实现了compare的方法,为什么在add的时候不是调用这个方法而是在CustomerComparator实现的compare的方法?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
treeset这个类,两种方式初始化,有指定比较器 和 没有指定比较器。
查看treeset这个类,父类是treemap,在执行add方法时,其实就是treemap的add。
源码要求,要么传一个comparator比较器给treeset;要么不传比较器时,要求元素类要实现comparable接口。
注:区分
Comparator 比较器的比较方法为 compare
Comparable 的比较方法为compareTo