黑马程序员技术交流社区
标题:
关于TreeSet的疑问
[打印本页]
作者:
DOOR
时间:
2014-1-4 03:28
标题:
关于TreeSet的疑问
本帖最后由 DOOR 于 2014-1-16 00:38 编辑
TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常?
作者:
净坛使者
时间:
2014-1-4 06:25
compareTO()只不过是个内部类实现的内部方法,如果要进行比较的话,使用
java.util.Collections.sort(persons);
使用这个来排来序,系统就会调用了
作者:
小悠久
时间:
2014-1-4 09:39
没有针对这个问题的确切的答案,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;
}
}
作者:
其LovE斤
时间:
2014-1-4 10:45
Person类
class Person implements Comparable<Person>{
private int age ;
private int id;
public Person(int age,int id){
this.age = age;
this.id = id;
}
public int compareTo(Person o) { //实现接口的compareTo方法
int num = new Integer(age).compareTo(o.age);
if(num == 0)
return new Integer(id).compareTo(o.id);
return num;
}
}
复制代码
Student类继承Person类
class Student extends Person{
private String name;
public Student(int age, int id,String name) {
super(age, id);
this.name = name;
}
public int compareTo(Student stu) //复写继承来的比较方法
{
return name.compareTo(stu.name); //只比较name
}
}
复制代码
主函数:泛型为父类
<P>public static void main(String[] args) throws Exception {
TreeSet<Person> ts = new TreeSet<Person>();
ts.add(new Person(1,2));
ts.add(new Person(1,3));
ts.add(new Person(1,4));
ts.add(new Student(1,4,"zhao"));
System.out.println(ts.size()); //输出3</P>
<P>
//反射添加一个Student对象
Class<?> clazz = ts.getClass();
Method meth = clazz.getMethod("add", Object.class);
meth.invoke(ts, new Student(1,2,"zhao"));
System.out.println(ts.size()); //输出3</P>
<P>
meth.invoke(ts, new Student(1,5,"zhao"));
System.out.println(ts.size()); //输出4</P>
<P>
</P>
复制代码
一个方法:泛型为子类
public static void fanTree()throws Exception
{
TreeSet<Student> ts = new TreeSet<Student>();
//ts.add(new Person(1,2)); //无法添加
ts.add(new Student(1,2,"zhao"));
System.out.println(ts.size()); //输出1
//反射添加一个父类Person对象
Class<?> clazz = ts.getClass();
Method meth = clazz.getMethod("add", Object.class);
meth.invoke(ts, new Student(1,2,"zhang"));
System.out.println(ts.size()); //输出1
meth.invoke(ts, new Person(1,2));
System.out.println(ts.size()); //输出1
}
复制代码
一个方法:不用泛型
public static void treeSet()
{
TreeSet ts = new TreeSet();
ts.add(new Person(1,2));
ts.add(new Person(1,3));
ts.add(new Person(1,4));
System.out.println(ts.size()); //输出3
ts.add(new Student(1,4,"zhao"));
System.out.println(ts.size()); //输出3
}
复制代码
一个方法:不带泛型2
<P>public static void treeSet2()
{
TreeSet ts = new TreeSet();
ts.add(new Student(1,4,"zhao"));
ts.add(new Person(1,2));
ts.add(new Person(1,3));
ts.add(new Person(1,4));
System.out.println(ts.size()); //输出3
ts.add(new Student(1,4,"zhang"));
System.out.println(ts.size()); //输出3
for(Iterator it = ts.iterator(); it.hasNext();)
{
System.out.println(it.next()); //结果:<A href="mailto:com.bbs.itheima.Person@1313906">com.bbs.itheima.Person@1313906</A>
<A href="mailto:com.bbs.itheima.Person@96cf11">com.bbs.itheima.Person@96cf11</A>
<A href="mailto:com.bbs.itheima.Student@f47bf5">com.bbs.itheima.Student@f47bf5</A>}</P>
<P> //说明将ts.add(new Student(1,4,"zhao"));添加进去了。但是ts.add(new Person(1,4));没有添加进去。</P>
<P> ts.add(new Student(1,4,"zhang"));这个并没有添加进去。
}</P>
复制代码
在加了泛型的情况下很明确 你泛型规定的谁,就是用的谁的。
但是 如果规定了是子类,那么父类是添加不进去的,因为父类实例对象无法向子类转型。
用反射将 一个父类的对象添加进去。是可以添加进去的。他还是用的父类的compareTo在比较。
在不加泛型的情况下,父类和子类都可以添加进去。
但是如果添加的子类的age和id 比较的是0。那么还是添加不进去的。
感觉应该根据的是 子类能向父类转型,但是父类无法向子类转型。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2