黑马程序员技术交流社区

标题: TreeSet问题 [打印本页]

作者: hmwudizl91zl    时间: 2013-10-6 11:34
标题: TreeSet问题
本帖最后由 hmwudizl91zl 于 2013-10-6 17:36 编辑

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

作者: The_Wizard    时间: 2013-10-6 12:37
这个考虑的情况有好几种:
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;
}
}   
作者: hyz123456    时间: 2013-10-6 12:39
执行到父类对象的时候调用父类的compareTo方法   
执行到子类对象的时候调用子类的compareTo方法     
作者: 麦子    时间: 2013-10-6 14:48
当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前这个对象的类中是如何编写这个方法的
作者: 乔兵    时间: 2013-10-6 16:16
问题解决后,请修改帖子分类为:提问结束




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2