問題: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