黑马程序员技术交流社区

标题: 新手疑惑--关于TreeSet一个问题 [打印本页]

作者: 李爱霞    时间: 2011-12-30 12:28
标题: 新手疑惑--关于TreeSet一个问题
本帖最后由 李爱霞 于 2011-12-30 12:44 编辑

TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法呢?
作者: 罗全涛    时间: 2011-12-30 12:37
本帖最后由 罗全涛 于 2011-12-30 12:38 编辑

如果要放入多个实例对象,一般会用到TreeSet(Collection<? extends E> c) 泛型已经限定了传入的类型,再有关于泛型的混淆,一个常见的来源就是假设它们像数组一样是协变的。其实它们不是协变的。。List<Object> 不是 List<String> 的父类型。
如果 A 扩展 B,那么 A 的数组也是 B 的数组,并且完全可以在需要 B[] 的地方使用
A[]:
Integer[] intArray = new Integer[10];
Number[] numberArray = intArray;
上面的代码是有效的,因为一个 Integer 是 一个 Number,因而一个 Integer 数组是 一个 Number 数组。但是对于泛型来说则不然。下面的代码是无效的:
List<Integer> intList = new ArrayList<Integer>();
List<Number> numberList = intList; // invalid
所以你说的同时放入了父类和子类的实例对象,我觉得是不存在的。至于调用谁的compartTo就不用探讨了。

作者: 海中的游弋草    时间: 2011-12-30 12:38
当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个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());

}



}


作者: 阮金明    时间: 2011-12-30 12:38
本帖最后由 阮金明 于 2011-12-30 12:40 编辑

{:soso_e107:}
作者: 李爱霞    时间: 2011-12-30 12:42
罗全涛 发表于 2011-12-30 12:37
如果要放入多个实例对象,一般会用到TreeSet(Collection

:)嘿嘿 稍微明白点
作者: 为梦而战    时间: 2011-12-30 12:42
本帖最后由 为梦而战 于 2011-12-30 12:45 编辑

这个要看你使用add()方法放入的是子类对象 还是父类对象了。你add()的是子类对象,那就使用子类的compareTo()方法比较了,要是你add()的是父类对象
那就使用父类的compareTo()方法了,也就是由当前使用add()方法放入哪个对象来决定使用谁的compareTo()方法。
作者: 李爱霞    时间: 2011-12-30 12:43
海中的游弋草 发表于 2011-12-30 12:38
当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前 ...

:) 结合示例理解起来更好
作者: 李爱霞    时间: 2011-12-30 12:44
谢谢大家的关照!{:soso_e181:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2