黑马程序员技术交流社区
标题:
TreeSet问题
[打印本页]
作者:
j816326
时间:
2013-6-12 20:43
标题:
TreeSet问题
本帖最后由 j816326 于 2013-6-13 19:45 编辑
TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
看下面代码 请给我个解释 最好详细点 。不怎么明白
public class Parent implements Comparable {
private int age = 0;
public Parent(int age){
this.age = age;
}
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;
}
}
public class Child extends Parent {
public Child(){
super(3);
}
public int compareTo(Object o) {
System.out.println("method of child");
// Child o1 = (Child)o;
return 1;
}
}
public class TreeSetTest {
public static void main(String[] args) {
TreeSet set = new TreeSet();
set.add(new Parent(3));
set.add(new Child());
set.add(new Parent(4));
System.out.println(set.size());
}
}
作者:
小冰块
时间:
2013-6-12 22:54
程序有点小问题:
1、没导包
2、一个文件里只能有一个public class,你一下定义了三个
你要知道你定义的TreeSet并没有限定类型,所以什么样的对象都能放(当然这是不安全的,往后面看视频,泛型里有),所以你在set.add()中放什么样的对象并没有直接关系。
你放child对象调用的就是child的compareTo方法,你放parent的对象调用的就是parent中的compareTo方法,甚至你放个cat或者dog都没关系,他们会调用自己的方法,前提是——你的compareTo方法中别写真正比较的代码,不然绝对会报类型转换异常(当然,现在你只是写了输出语句,所以没什么问题,但是这样的写法是非常不安全的),因为不同的类没有可比性啊。
如果你想用父类的方法比较子类,或将子类的方法给父类对象用,还是那句话,等你看到泛型就明白了,泛型限定就是为了泛型扩展用的。
作者:
x378320002
时间:
2013-6-12 23:45
本帖最后由 x378320002 于 2013-6-12 23:47 编辑
楼主的意思我明白,没太理解好Tree类集合添加和存储特点吧,这个代码稍加改动还是能执行的,
我就给你解释下下面这段是怎么执行的,你就在仔细想想
TreeSet set = new TreeSet();
set.add(new Parent(3)); -------- Parent(3)对象调用自己的compareTo方法和自己比较,因为是第一个
set.add(new Child());----------------new Child()对象调用自己的compareTo方法和 Parent(3)比较,返回正数则说明比 Parent(3)大,放在 Parent(3)右面存储。
set.add(new Parent(4));-------------new Parent(4)对象调用自己的compareTo方法和 Parent(3)比较(注意这里是关键),发现比 Parent(3)大,往右走,发现还有个new Child()
,那么new Parent(4)对象再调用自己的compareTo方法和new Child()比较,4比3大,所以放在-new Child()右面。
System.out.println(set.size());
继续往里存储,依次规律,注意,树形结构,说明是从节点开始比较,并不是比刚存进去的哪一个。这里只讨论运行,所以泛型与否不用管,没什么关系。
这个没有多态,所以什么覆盖继承什么的,也涉及不到。
作者:
尹丽峰
时间:
2013-6-13 00:12
比如说实现Comparable 重写compareTo方法后 在compareTo方法中在使用compareTo的话 肯定还是用的父类的。只有你子类调用 实现了Comparable 类的时候才会用到对应的CompareTo
作者:
孙百鑫
时间:
2013-6-13 06:42
如果代码多的情况下,可以将代码放在代码块中哦~编辑的时候笑脸旁边就是 "<>"
楼主您好!如果问题得到解决请将题目改成"已解决"
编辑文章-->修改 如果问题没有得到解决请继续发问谢谢您的配合{:soso_e100:}
作者:
j816326
时间:
2013-6-13 19:45
谢谢大家热心的帮我解惑。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2