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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李爱霞 黑马帝   /  2011-12-30 12:28  /  2544 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李爱霞 于 2011-12-30 12:44 编辑

TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法呢?

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 罗全涛 于 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就不用探讨了。

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
当前的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());

}



}

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 阮金明 于 2011-12-30 12:40 编辑

{:soso_e107:}
回复 使用道具 举报
罗全涛 发表于 2011-12-30 12:37
如果要放入多个实例对象,一般会用到TreeSet(Collection

:)嘿嘿 稍微明白点
回复 使用道具 举报
本帖最后由 为梦而战 于 2011-12-30 12:45 编辑

这个要看你使用add()方法放入的是子类对象 还是父类对象了。你add()的是子类对象,那就使用子类的compareTo()方法比较了,要是你add()的是父类对象
那就使用父类的compareTo()方法了,也就是由当前使用add()方法放入哪个对象来决定使用谁的compareTo()方法。
回复 使用道具 举报
李爱霞 黑马帝 2011-12-30 12:43:50
7#
海中的游弋草 发表于 2011-12-30 12:38
当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前 ...

:) 结合示例理解起来更好
回复 使用道具 举报
李爱霞 黑马帝 2011-12-30 12:44:13
8#
谢谢大家的关照!{:soso_e181:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马