黑马程序员技术交流社区

标题: 关于集合TreeSet的集合添加第一个元素就报类型转换异常 [打印本页]

作者: 浮云只想听你説    时间: 2014-3-30 19:28
标题: 关于集合TreeSet的集合添加第一个元素就报类型转换异常
就是一个简单的程序,给TreeSet集合中存对象。
我知道需要实现Comparable接口。
但是不实现的话存第一个元素应该是正常的啊,我将上面实现的部分去掉后发现存的第一个元素就抛出类型转化异常,求大神这是为什么?

作者: 浮云只想听你説    时间: 2014-3-30 19:40
代码如下
import java.util.*;
class Student
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }

        public void setName(String age)
        {
                this.name=name;
        }
        public void setAge(int age)
        {
                this.age=age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
class TreeSetDemo
{
        public static void main(String[] args)
        {
                TreeSet ts=new TreeSet();
                ts.add(new Student("shiyanfang01",23));
//                ts.add(new Student("shiyanfang02",35));
//                ts.add(new Student("shiyanfang03",28));
                for (Iterator it=ts.iterator();it.hasNext() ; )
                {
                        Student stu=(Student)it.next();
                        System.out.println(stu.getName()+".."+stu.getAge());
                }
        }
}

作者: 谭荣强    时间: 2014-3-31 00:06
代码确实没错。找了半天也没找到原因,看了看文档,发现set的构造方法的定义: 插入该 set 的所有元素都必须实现 Comparable 接口。 。但是老毕视频中的没实现确实也可以添加。不知道问什么,同求。
作者: 黄晓鑫    时间: 2014-3-31 00:13
这道题我面试过,老师问过我说Set集合是靠什么来判断元素的唯一性的。一是实现Comparable中的compareTo方法,二是Comparator接口的compare方法,而底层是用过hashCode和equals方法保证元素的唯一性的。
作者: duanyoujiji    时间: 2014-3-31 01:17
这个可能是老师的失误,没编译就运行了可能,我也试了几次eclipse和EditPlus都不行,我同学也试了,今天 他还问这个问题了呢。
作者: 浮云只想听你説    时间: 2014-3-31 02:39
duanyoujiji 发表于 2014-3-31 01:17
这个可能是老师的失误,没编译就运行了可能,我也试了几次eclipse和EditPlus都不行,我同学也试了,今天 他 ...

哈哈,你这个想法不错...因为看视频明明是可以的,自己也用各种工具尝试了很多次就是不行。
作者: ς高眼光の目标    时间: 2014-3-31 05:07
import java.util.*; class Student  {         private String name;         private int age;         Student(String name,int age)         {                 this.name=name;                 this.age=age;         }          public void setName(String age)         {                 this.name=name;         }         public void setAge(int age)         {                 this.age=age;         }         public String getName()         {                 return name;         }         public int getAge()         {                 return age;         } } class TreeSetDemo  {         public static void main(String[] args)          {                 TreeSet<Student> ts=new TreeSet<Student>();                 ts.add(new Student("shiyanfang01",23)); //                ts.add(new Student("shiyanfang02",35)); //                ts.add(new Student("shiyanfang03",28));                 for (Iterator it=ts.iterator();it.hasNext() ; )                 {                         Student stu=(Student)it.next();                         System.out.println(stu.getName()+".."+stu.getAge());                 }         } }
作者: ς高眼光の目标    时间: 2014-3-31 05:10
import java.util.*;
class Student
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }

        public void setName(String age)
        {
                this.name=name;
        }
        public void setAge(int age)
        {
                this.age=age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
class TreeSetDemo
{
        public static void main(String[] args)
        {
                TreeSet<Student> ts=new TreeSet<Student>();
                ts.add(new Student("shiyanfang01",23));
//                ts.add(new Student("shiyanfang02",35));
//                ts.add(new Student("shiyanfang03",28));
                for (Iterator it=ts.iterator();it.hasNext() ; )
                {
                        Student stu=(Student)it.next();
                        System.out.println(stu.getName()+".."+stu.getAge());
                }C:\Documents and Settings\Administrator\桌面
        }
}//加了泛型就编译通过,运行就挂了
作者: ς高眼光の目标    时间: 2014-3-31 05:11
补上图片

8~EE~5%HM`3X@6O33GRC`BA.jpg (57.69 KB, 下载次数: 28)

8~EE~5%HM`3X@6O33GRC`BA.jpg

作者: ╰青青子佩ˊゝ    时间: 2014-3-31 09:23
3点提醒你,希望能帮到你。看下面代码。
  1. class Student
  2. {
  3.         private String name;
  4.     private int age;
  5.     Student(String name,int age)
  6.     {
  7.             this.name=name;
  8.             this.age=age;
  9.     }

  10.     public void setName(String age)
  11.     {
  12.             this.name=name;
  13.     }
  14.     public void setAge(int age)
  15.     {
  16.             this.age=age;
  17.     }
  18.     public String getName()
  19.     {
  20.             return name;
  21.     }
  22.     public int getAge()
  23.     {
  24.             return age;
  25.     }
  26. }
  27. class TreeSetDemo
  28. {
  29.         public static void main(String[] args)
  30.     {
  31.             TreeSet ts=new TreeSet();
  32.                 //1.TreeSet底层数据结构是二叉树,先比较,再存入,那么往TreeSet对象中存入元素时,元素必须具备比较性。
  33.                 //如果元素是字符串,如下,那么字符串自身具备比较性,那么自然编译执行都没问题。
  34.                 ts.add("abef");
  35.         ts.add("bdh");
  36.         ts.add("zxc");
  37.                 //2.如果元素是Student类的对象,Student对象不具备比较性,那么会报异常说没有实现Comparable接口,所以要实现Comparable接口,并复写compareTo方法,让Student对象具备比较性。
  38.         //3.在你的代码中尝试了只将一个Student对象存入,那当然没问题,因为只有一个Student对象元素不需要比较。
  39.         ts.add(new Student("shiyanfang01",23));
  40.         ts.add(new Student("shiyanfang02",35));
  41.         ts.add(new Student("shiyanfang03",28));
  42.         for (Iterator it=ts.iterator();it.hasNext() ; )
  43.         {
  44.                     Student stu=(Student)it.next();
  45.                 System.out.println(stu.getName()+".."+stu.getAge());
  46.         }
  47.     }       
  48. }
复制代码

作者: 谭荣强    时间: 2014-3-31 18:04
浮云只想听你説 发表于 2014-3-31 02:39
哈哈,你这个想法不错...因为看视频明明是可以的,自己也用各种工具尝试了很多次就是不行。 ...

我也感觉是老师的失误,但是老是明明编译了,而且还运行通过了。
作者: 谭荣强    时间: 2014-3-31 18:06
╰青青子佩ˊゝ 发表于 2014-3-31 09:23
3点提醒你,希望能帮到你。看下面代码。

关键是第三条现在无法实现,你试试
作者: ╰青青子佩ˊゝ    时间: 2014-4-1 09:24
谭荣强 发表于 2014-3-31 18:06
关键是第三条现在无法实现,你试试

我试了,可以,只存一个Student对象
作者: 谭荣强    时间: 2014-4-1 11:46
╰青青子佩ˊゝ 发表于 2014-4-1 09:24
我试了,可以,只存一个Student对象

你运行下这段代码试试,我怎么运行就报异常
import java.util.*;
class Student
{
    private String name;
    private int age;
    Student(String name,int age)
    {
            this.name=name;
            this.age=age;
    }
    public String getName()
    {
            return name;
    }
    public int getAge()
    {
            return age;
    }
}
class lianxi
{
    public static void main(String[] args)
    {
        TreeSet ts=new TreeSet();                 
        ts.add(new Student("shiyanfang01",23));   
    }        
}

作者: ╰青青子佩ˊゝ    时间: 2014-4-1 13:21
谭荣强 发表于 2014-4-1 11:46
你运行下这段代码试试,我怎么运行就报异常
import java.util.*;
class Student

用Editplus是会抱异常,用myeclipse就不会.别纠结了,反正以后都实现comparable就行了。




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