A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© DOOR 中级黑马   /  2014-1-4 03:28  /  1216 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 DOOR 于 2014-1-16 00:38 编辑

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

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

3 个回复

倒序浏览
compareTO()只不过是个内部类实现的内部方法,如果要进行比较的话,使用
java.util.Collections.sort(persons);
使用这个来排来序,系统就会调用了

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
没有针对这个问题的确切的答案,add方法放入的是哪个对象,就会调用哪个对象的compareTo方法

实验代码:

public class Parent implements Comparable {

    private int age = 0;

    public Parent(int age){

       this.age = age;

    }

    public int compareTo(Object o) {

       // TODO Auto-generated method stub

       System.out.println("method of parent");

       Parent o1 = (Parent)o;

       return age>o1.age?1:age<o1.age?-1:0;

    }



}



public class Child extends Parent {



    public Child(){

       super(3);

    }

    public int compareTo(Object o) {



           // TODO Auto-generated method stub

           System.out.println("method of child");

//         Child o1 = (Child)o;

           return 1;

    }

}

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
Person类
  1. class Person implements Comparable<Person>{
  2.     private int age ;
  3.     private int id;
  4.     public Person(int age,int id){
  5.     this.age = age;
  6.     this.id = id;
  7.      }
  8. public int compareTo(Person o) {     //实现接口的compareTo方法
  9. int num = new Integer(age).compareTo(o.age);
  10. if(num == 0)
  11. return new Integer(id).compareTo(o.id);
  12. return num;
  13. }
  14. }
复制代码
Student类继承Person类
  1. class Student extends Person{

  2. private String name;
  3. public Student(int age, int id,String name) {
  4. super(age, id);
  5. this.name = name;
  6. }
  7. public int compareTo(Student stu)  //复写继承来的比较方法
  8. {
  9. return name.compareTo(stu.name); //只比较name
  10. }
  11. }
复制代码
主函数:泛型为父类

  1. <P>public static void main(String[] args) throws Exception {
  2. TreeSet<Person> ts = new TreeSet<Person>();
  3. ts.add(new Person(1,2));
  4. ts.add(new Person(1,3));
  5. ts.add(new Person(1,4));
  6. ts.add(new Student(1,4,"zhao"));
  7. System.out.println(ts.size());                                //输出3</P>
  8. <P>
  9. //反射添加一个Student对象
  10. Class<?> clazz = ts.getClass();
  11. Method meth = clazz.getMethod("add", Object.class);
  12. meth.invoke(ts, new Student(1,2,"zhao"));
  13. System.out.println(ts.size());                             //输出3</P>
  14. <P>
  15. meth.invoke(ts, new Student(1,5,"zhao"));
  16. System.out.println(ts.size());                           //输出4</P>
  17. <P>
  18. </P>
复制代码
一个方法:泛型为子类
  1. public static void fanTree()throws Exception
  2. {
  3. TreeSet<Student> ts = new TreeSet<Student>();
  4. //ts.add(new Person(1,2));                   //无法添加
  5. ts.add(new Student(1,2,"zhao"));
  6. System.out.println(ts.size());                //输出1
  7. //反射添加一个父类Person对象
  8. Class<?> clazz = ts.getClass();
  9. Method meth = clazz.getMethod("add", Object.class);
  10. meth.invoke(ts, new Student(1,2,"zhang"));
  11. System.out.println(ts.size());               //输出1
  12. meth.invoke(ts, new Person(1,2));
  13. System.out.println(ts.size());              //输出1
  14. }
复制代码
一个方法:不用泛型
  1. public static void treeSet()
  2. {
  3. TreeSet ts = new TreeSet();
  4. ts.add(new Person(1,2));
  5. ts.add(new Person(1,3));
  6. ts.add(new Person(1,4));
  7. System.out.println(ts.size());   //输出3
  8. ts.add(new Student(1,4,"zhao"));
  9. System.out.println(ts.size());   //输出3

  10. }
复制代码
一个方法:不带泛型2

  1. <P>public static void treeSet2()
  2. {
  3. TreeSet ts = new TreeSet();
  4. ts.add(new Student(1,4,"zhao"));
  5. ts.add(new Person(1,2));
  6. ts.add(new Person(1,3));
  7. ts.add(new Person(1,4));
  8. System.out.println(ts.size()); //输出3
  9. ts.add(new Student(1,4,"zhang"));
  10. System.out.println(ts.size()); //输出3
  11. for(Iterator it = ts.iterator(); it.hasNext();)
  12. {
  13. System.out.println(it.next());     //结果:<A href="mailto:com.bbs.itheima.Person@1313906">com.bbs.itheima.Person@1313906</A>
  14.                                                                  <A href="mailto:com.bbs.itheima.Person@96cf11">com.bbs.itheima.Person@96cf11</A>
  15.                                                                  <A href="mailto:com.bbs.itheima.Student@f47bf5">com.bbs.itheima.Student@f47bf5</A>}</P>
  16. <P>                                               //说明将ts.add(new Student(1,4,"zhao"));添加进去了。但是ts.add(new Person(1,4));没有添加进去。</P>
  17. <P>                                                ts.add(new Student(1,4,"zhang"));这个并没有添加进去。


  18. }</P>
复制代码
在加了泛型的情况下很明确  你泛型规定的谁,就是用的谁的。
但是 如果规定了是子类,那么父类是添加不进去的,因为父类实例对象无法向子类转型。
用反射将 一个父类的对象添加进去。是可以添加进去的。他还是用的父类的compareTo在比较。

在不加泛型的情况下,父类和子类都可以添加进去。
但是如果添加的子类的age和id 比较的是0。那么还是添加不进去的。

感觉应该根据的是   子类能向父类转型,但是父类无法向子类转型。


评分

参与人数 1技术分 +2 收起 理由
田磊阳 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马