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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 从前有个人 于 2013-11-18 20:10 编辑

package temptest;
import java.util.*;
class TempForTest {

        static void sop(Object obj){
                System.out.println(obj);
        }

        public static void main(String[] argus){
                TreeSet ts = new TreeSet();

                ts.add(new Students("san03",33));
                ts.add(new Students("milo",33));
                ts.add(new Students("san01",11));

                Iterator it = ts.iterator();
                while(it.hasNext()){
                        Students stu = (Students)it.next();
                        sop(stu.getName()+" "+stu.getAge());
                }
        }
}
class Students implements Comparable{  //该接口强制让学生具备比较性
        private String name;
        private int age;
        
        Students(String name, int age){
                this.name = name;
                this.age = age;
        }
        public int compareTo(Object obj){
                if(!(obj instanceof Students))  //为啥要写这句
throw new RuntimeException("不是学生对象");

                Students s = (Students)obj;
                if(this.age - s.age == 0){
                        return this.name.compareTo(s.name);
                }
                else
                        return this.age - s.age;
        }
        public String getName(){
                return name;
        }
        public int getAge(){
                return age;
        }
}

毕老师视频中为什么要写那句加深的判断代码呢?容器中添加的如果不是Students类的对象怎么能调用到这个方法呢,既然必须是Strudents的对象才能调用,为啥还要判断呢?如果是我的理解有问题,谁能帮我实现一下抛出异常的情况。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

3 个回复

倒序浏览
1.首先 你定义的TreeSet 集合并没有使用泛型。没有对集合存储的对象类型进行限定,那么该集合就可以存储所有类型的对象。
2.你定义了一个学生类,实现Comparable接口,覆盖compareTo方法让该类具备了可比较性,但是接收的却是Object类型的,所以要进行健壮性判断。也就是要同一类型才能判断,学生和学生才能比较。

根据抛出的异常也能看出,最简单的一个道理:如果传进来的是一个dog类,dog和student有可比性吗?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
首先,你传入的对象必须具有比较性,要实现comParable接口,才能传入TreeMap集合
你可以创建一个Worker类
class Worker implements Comparable{
        private String name;
        private int age;
        public Worker(String name, int age) {
                super();
                this.name = name;
                this.age = age;
        }
        @Override
        public int compareTo(Object o) {
                // TODO Auto-generated method stub
                return 1;
        }       
}
把这个Worker类加入到你的代码中,
然后ts.add(new Worker("zhangsan", 30)),作为第一个对象加入TreeMap,
再ts.add(new Students("z3",32));添加一个Students对象,
这时Students对象就会调用compareTo()方法,
就会抛异常Exception in thread "main" java.lang.RuntimeException: 不是学生对象
回复 使用道具 举报
本帖最后由 从前有个人 于 2013-11-18 20:15 编辑
@ne_pie尒ce 发表于 2013-11-18 17:13
首先,你传入的对象必须具有比较性,要实现comParable接口,才能传入TreeMap集合
你可以创建一个Worker类
c ...

这个才真正帮我解决了问题,烦请 @滔哥 来加分
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马