黑马程序员技术交流社区

标题: 前几天看到这个问题与大家分享 TreeSet里面放对象,如果同时放入了父 [打印本页]

作者: 毕博    时间: 2012-4-26 13:25
标题: 前几天看到这个问题与大家分享 TreeSet里面放对象,如果同时放入了父
        前几天看到这个问题与大家分享   TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常?  
作者: 贾联国    时间: 2012-4-26 14:21
本帖最后由 贾联国 于 2012-4-26 14:48 编辑

我觉得应该抛ClassCastException ,TreeSet中的自然排序必须是里面的元素满足comparable接口才行,而子类和父类的compareTo方法不一样,就不能进行自然排序

我自己写了个程序 没有写泛型(其实就是偷懒,把以前的程序直接贴上来了 连改都没改,很多都是没用的   见谅!^_^) 亲自测试是会抛异常的

Exception in thread "main" java.lang.ClassCastException: Student cannot be cast
to Person
        at Person.compareTo(TreeSetDemo.java:58)
        at java.util.TreeMap.put(TreeMap.java:560)
        at java.util.TreeSet.add(TreeSet.java:255)
        at TreeSetDemo.main(TreeSetDemo.java:9)
  1. import java.util.*;
  2. class  TreeSetDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet ts = new TreeSet();
  7.                 ts.add(new Student("lisi1",31));
  8.                 ts.add(new Student("lisi2",32));
  9.                 ts.add(new Person("lisi3",33));
  10.                 ts.add(new Person("lisi4",34));
  11.                 Iterator it= ts.iterator();
  12.                 while(it.hasNext())
  13.                 {
  14.                         System.out.println(it.next());
  15.                 }
  16.                
  17.         }
  18. }
  19. class Student implements Comparable
  20. {
  21.         private String name;
  22.         private int age;
  23.         Student () {}
  24.         Student (String name ,int age)
  25.         {
  26.                 this.name=name;
  27.                 this.age= age;

  28.         }
  29.         public int compareTo(Object obj)
  30.         {
  31.                 if(!(obj instanceof Student))
  32.                         throw new RuntimeException("bushi");
  33.                 Student s= (Student) obj;
  34.                 if(this.age>s.age)
  35.                         return 1;
  36.                 if(this.age==s.age)
  37.                         return 0;
  38.                 return -1;
  39.         }
  40.   }
  41. class Person extends Student  implements Comparable
  42. {
  43.         private String name;
  44.         private int age;

  45.         Person (String name ,int age)
  46.         {
  47.                 this.name=name;
  48.                 this.age= age;

  49.         }
  50.         public int compareTo(Object obj)
  51.         {
  52.                 if(!(obj instanceof Student))
  53.                         throw new RuntimeException("bushi");
  54.                 Person p= (Person) obj;
  55.                 return this.name.compareTo(p.name);
  56.         }
  57.   }
复制代码

作者: 邓斌    时间: 2012-4-26 18:03
呵呵,,父类和子类的比较器,当然就是子类的呗,子类吧方法覆盖了。




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