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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© quan23355 中级黑马   /  2013-11-26 16:28  /  1528 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 quan23355 于 2013-11-26 22:58 编辑

下面的TreeSet同时放入了父类和子类的实例对象,实现Comparable接口的compareTo方法时,为什么要转成具体的对象?帮我详细解释下
  1. public class Parent implements Comparable {
  2.         private int age = 0;
  3.         public Parent(int age){
  4.                 this.age = age;
  5.         }
  6.         public int compareTo(Object o) {
  7.                 // TODO Auto-generated method stub
  8.                 System.out.println("method of parent");
  9.                 Parent o1 = (Parent)o;
  10.                 return age>o1.age?1:age<o1.age?-1:0;
  11.         }

  12. }

  13. public class Child extends Parent {

  14.         public Child(){
  15.                 super(3);
  16.         }
  17.         public int compareTo(Object o) {

  18.                         // TODO Auto-generated method stub
  19.                         System.out.println("method of child");
  20. //                        Child o1 = (Child)o;
  21.                         return 1;

  22.         }
  23. }

  24. public class TreeSetTest {

  25.         /**
  26.          * @param args
  27.          */
  28.         public static void main(String[] args) {
  29.                 // TODO Auto-generated method stub
  30.                 TreeSet set = new TreeSet();
  31.                 set.add(new Parent(3));
  32.                 set.add(new Child());
  33.                 set.add(new Parent(4));
  34.                 System.out.println(set.size());
  35.         }

  36. }
复制代码



评分

参与人数 1技术分 +1 黑马币 +5 收起 理由
枫儿 + 1 + 5 神马都是浮云

查看全部评分

4 个回复

倒序浏览
本帖最后由 低调的奢华 于 2013-11-26 16:58 编辑

没太理解你的意思。是问这句吗?
  1. Parent o1 = (Parent)o;
复制代码
如果是的话,是因为
  1. return age>o1.age?1:age<o1.age?-1:0;
复制代码
要使用Parent的属性。




回复 使用道具 举报
我的理解是:因为你继承了Comparable接口,而Comparable接口是强行对实现它的每个类的对象进行整体排序,所以需要转成具体的对象。
回复 使用道具 举报
  1. Parent o1 = (Parent)o;
  2. return age>o1.age?1:age<o1.age?-1:0;
复制代码

是这两行吗?

如果是的话是这样的,看这个函数
  public int compareTo(Object o)
形参 Object o  这是个Object 类型的变量  Object类型里边可没说有 age 这个属性啊 。age这个属性是你Person中的属性,所以你得强转成person,才能o.age这么调用啊

添一句 TreeSet底层调用的是compareTo这个函数进行排序。
回复 使用道具 举报
我想你问的是这段代码,对吧
  1.       public int compareTo(Object o) {
  2.                 System.out.println("method of parent");
  3.                 Parent o1 = (Parent)o;
  4.                 return age>o1.age?1:age<o1.age?-1:0;
  5.         }
复制代码

这里是重写了compareTo方法,compareTo方法比较的是对象,
如果都是Object类的对象,那么等同于两个Object超类对象进行比较,没有意义。

这段代码里,return 后面的三元表达式中使用了Parent中的成员变量,
如果不向下转型的话,Object中是没有age这个属性的,那就不能比较了。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

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