问题:TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
我个人测试的结果是:当前的add方法 先 放入父类的对象,就会报错。 如果 先 放入子类的对象,则各自调用各自的compareTo()方法进行排序。
引入问题: 如果 子类没有重写 compareTo()方法,放入子类和父类的对象的顺序 可以随便放,但是遍历的结果子类对象只能加入一个。这又是为什么?????求解?
看代码:
package 测试比较父类子类conpateTo;
public class Parent implements Comparable {
private String name;
private int age;
public int getAge(){
return age;
}
public Parent(){
System.err.println("Parent无参构造器"+name+":"+age);
};
public Parent(String name,int age){
this.name=name;
this.age=age;
System.err.println("Parent双参构造器"+name+":"+age);
}
//父类年龄升序排列
@Override
public int compareTo(Object o) {
Parent obj = (Parent)o;
return this.age-obj.getAge();
}
public String toString(){
return name+":"+age;
}
}
package 测试比较父类子类conpateTo;
public class Children extends Parent {
private String name;
private int age;
public Children(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
//子类年龄降序排列
public int compareTo(Object o){
Children c=(Children)o;
return c.age-this.age;
}
public String toString(){
return name+":"+age;
}
}
测试1:
先放入父类任意一个对象,报错 ClassCastException
public class Test {
public static void main(String[] args) {
TreeSet<Parent> t=new TreeSet();
Parent p=new Parent("Parent1", 45);
Parent p1=new Parent("Parent2", 47);
Parent p2=new Parent("Parent3", 24);
Parent p4=new Parent("Parent4", 22);
Children c1=new Children("Jame1",12);
Children c2=new Children("Jame2",23);
Children c3=new Children("Jame3",46);
System.out.println("TreeSet遍历-------");
//先放入父类任意一个对象,报错 ClassCastException
t.add(p);
t.add(c2);
t.add(c1);
t.add(p1);
t.add(p4);
t.add(c3);
t.add(p2);
Iterator<Parent> iterator=t.iterator();
while(iterator.hasNext()){
System.err.println(iterator.next());
}
}
}
测试2:
//先放入子类的对象
t.add(c2);
t.add(c1);
t.add(p1);
t.add(p4);
t.add(c3);
t.add(p);
t.add(p2);
输出结果:
Parent双参构造器Parent1:45
Parent双参构造器Parent2:47
Parent双参构造器Parent3:24
Parent双参构造器Parent4:22
Parent无参构造器null:0
Parent无参构造器null:0
Parent无参构造器null:0
TreeSet遍历-------
Jame3:46
Jame2:23
Jame1:12
Parent4:22
Parent3:24
Parent1:45
Parent2:47
测试3: 子类没有重写 compareTo()方法
t.add(p4);
t.add(c3); //我先加入,只有我了
t.add(c2);
t.add(p2);
t.add(p1);
t.add(p);
t.add(c1);
Parent双参构造器Parent1:45
Parent双参构造器Parent2:47
Parent双参构造器Parent3:24
Parent双参构造器Parent4:22
Parent无参构造器null:0
Parent无参构造器null:0
Parent无参构造器null:0
TreeSet遍历-------
Jame3:46
Parent4:22
Parent3:24
Parent1:45
Parent2:47