这个考虑的情况有好几种:
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;
}
} |