A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

1 个回复

倒序浏览
本帖最后由 张锐 于 2012-3-13 19:38 编辑

写了个程序验证了下:main函数和父类是这样的:
  1. package test;

  2. import java.util.Collection;
  3. import java.util.TreeSet;

  4. import myutil.SOP;

  5. public class Lianxi {

  6.         public static void main(String[] args)
  7.     {
  8.                 Collection<Fu> c = new TreeSet<Fu>();
  9.                 c.add(new Fu("aa"));
  10.                 c.add(new Fu("bb"));
  11.                 c.add(new Fu("cc"));
  12.                 c.add(new Zi("aba",10));
  13.                 c.add(new Zi("ccb",20));
  14.                 SOP.sop(c);
  15.                
  16.     }
  17. }

  18. class Fu implements Comparable<Fu> {
  19.         String name;
  20.         Fu(String name){
  21.                 this.name = name;
  22.         }
  23.         public int compareTo(Fu o) {
  24.                 // TODO Auto-generated method stub
  25.                 SOP.sop("fu compare  "+this.name+"..."+o.name);
  26.                 return this.name.compareTo(o.name);
  27.         }
  28. }
复制代码
子类分为不同的情况试试。
第一种情况:
  1. class Zi extends Fu{
  2.         int age;
  3.         Zi(String name,int age) {
  4.                 super(name);
  5.                 this.age = age;
  6.                 // TODO Auto-generated constructor stub
  7.         }

  8.         public int compareTo(Fu o) {
  9.                 // TODO Auto-generated method stub
  10.                 SOP.sop("zi compare  "+this.name+"..."+o.name);
  11.                 return this.name.compareTo(o.name);
  12. //                return new Integer(this.age).compareTo(new Integer(z.age));               
  13.         }
  14.        
  15.        
  16. }
复制代码
这时候的输出结果是:
fu compare  bb...aa
fu compare  cc...aa
fu compare  cc...bb
zi compare  aba...bb
zi compare  aba...aa
zi compare  ccb...bb
zi compare  ccb...cc
[aa, aba, bb, cc, ccb]

第二种子类的情况:
  1. class Zi extends Fu{
  2.         int age;
  3.         Zi(String name,int age) {
  4.                 super(name);
  5.                 this.age = age;
  6.                 // TODO Auto-generated constructor stub
  7.         }

  8.         public int compareTo(Zi o) {
  9.                 // TODO Auto-generated method stub
  10.                 SOP.sop("zi compare  "+this.name+"..."+o.name);
  11. //                return this.name.compareTo(o.name);
  12.                 return new Integer(this.age).compareTo(new Integer(o.age));               
  13.         }
  14.        
  15.        
  16. }
复制代码
这时候的输出结果是:
fu compare  bb...aa
fu compare  cc...aa
fu compare  cc...bb
fu compare  aba...bb
fu compare  aba...aa
fu compare  ccb...bb
fu compare  ccb...cc
[aa, aba, bb, cc, ccb]

所以根据我的理解,结论是:

子类和父类比较的时候,
如果子类可以实现和父类的“交叉”比较,则调用子类的比较方法。
如果子类不可以实现和父类的“交叉”比较,就直接调用父类的比较,这时候因为多态的存在,父类是肯定可以实现和子类的比较出结果的。

评分

参与人数 1技术分 +2 收起 理由
房宝彬 + 2 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马