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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hmwudizl91zl 中级黑马   /  2013-10-6 11:34  /  1264 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hmwudizl91zl 于 2013-10-6 17:36 编辑

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

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

4 个回复

倒序浏览
这个考虑的情况有好几种:
1,子类没有 compareTo方法,这时同时放入了父类和子类的实例对象使用的都是父类的compareTo方法。

2,如果子类也有 compareTo方法,在添加子类对象时会调用子类的 compareTo方法。这时得看子类的 compareTo方法怎么实现了。因为TreeSet对象调用 add(子类) 时,会调用子类的 compareTo方法,该方法的参数传递是Object对象,这里传递时TreeSet对象中的各个元素,只要能运行下去,TreeSet对象中有几个元素,就会调用子类的 compareTo方法几次来进行比较。比如将元素1作为参数传递进去,如果元素1是父类对象,注意不要讲该元素转换成子类对象,这样肯定会出异常的,所以只能将TreeSet对象要添加的子类对象转换成父类对象。
代码如下:
import java.util.TreeSet;

public class CompareTo1 {

        public static void main(String[] args) {
                TreeSet ts = new TreeSet();
               
                ts.add(new Person("p1", 20));
                ts.add(new Person("p2", 20));
                ts.add(new Person("p3", 20));
               
                ts.add(new Student("s1", 20));
                ts.add(new Student("s1", 21));
                ts.add(new Student("s1", 22));
               
                System.out.println(ts);

        }

}

class Person implements Comparable{
        String name;
        int age;
        public Person(String name, int age){
                this.name = name;
                this.age = age;
        }
       
        public int compareTo(Object o) {
                Person p = (Person)o;
                System.out.println("personCmp: " + this + " cmp " + p);
                return name.compareTo(p.name);
        }
       
        public String toString(){
                String s = name + "---" + age;
                return s;
        }
}

class Student extends Person {
        public Student(String name, int age){
                super(name, age);
        }
       
//        public int compareTo(Object o){
//                Student s = (Student)o;
//                System.out.println("StudentCmp" + this + " cmp " + s);
//                return age - s.age;
//        }
        public int compareTo(Object o){
                Person s = (Person) o;
                System.out.println("StudentCmp" + this + " cmp " + s);
                return age - s.age;
}
}   

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
执行到父类对象的时候调用父类的compareTo方法   
执行到子类对象的时候调用子类的compareTo方法     

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前这个对象的类中是如何编写这个方法的

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
问题解决后,请修改帖子分类为:提问结束
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马