黑马程序员技术交流社区
标题:
TreeSet存放对象问题
[打印本页]
作者:
quan23355
时间:
2013-11-26 16:28
标题:
TreeSet存放对象问题
本帖最后由 quan23355 于 2013-11-26 22:58 编辑
下面的TreeSet
同时放入了父类和子类的实例对象,实现
Comparable接口的
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;
}
}
public class TreeSetTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet set = new TreeSet();
set.add(new Parent(3));
set.add(new Child());
set.add(new Parent(4));
System.out.println(set.size());
}
}
复制代码
作者:
低调的奢华
时间:
2013-11-26 16:57
本帖最后由 低调的奢华 于 2013-11-26 16:58 编辑
没太理解你的意思。是问这句吗?
Parent o1 = (Parent)o;
复制代码
如果是的话,是因为
return age>o1.age?1:age<o1.age?-1:0;
复制代码
要使用Parent的属性。
作者:
殷挥笔
时间:
2013-11-26 19:20
我的理解是:因为你继承了Comparable接口,而Comparable接口是强行对实现它的每个类的对象进行整体排序,所以需要转成具体的对象。
作者:
ysunday
时间:
2013-11-26 21:56
Parent o1 = (Parent)o;
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这个函数进行排序。
作者:
胡陈思
时间:
2013-11-26 22:08
我想你问的是这段代码,对吧
public int compareTo(Object o) {
System.out.println("method of parent");
Parent o1 = (Parent)o;
return age>o1.age?1:age<o1.age?-1:0;
}
复制代码
这里是重写了compareTo方法,compareTo方法比较的是对象,
如果都是Object类的对象,那么等同于两个Object超类对象进行比较,没有意义。
这段代码里,return 后面的三元表达式中使用了Parent中的成员变量,
如果不向下转型的话,Object中是没有age这个属性的,那就不能比较了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2