1 先来看看错误- TreeSet<Student> ts = new TreeSet<Student>();
- ts.add(new Student("lisi01"));
- ts.add(new Student("lisi02"));//ClassCastException: Student cannot be cast to java.lang.Comparable
- //ts.add(new Student("lisi03"));
复制代码 类型转换异常:Student 类不能转换为 Compareable
虽然你是在做泛型的测试,但是我们看到错误提示有Compareable。
在看到你定义的是一个TreeSet集合。很明显的是被添加的类没有实现Compareable接口。
2 TreeSet集合
2.1
在使用集合时,我们要注意的是,这个集合的底层数据结构特点,知道它的特点后
才知道这个集合是怎样存放东西的。添加到TreeSet集合中的对象要实现Compareable
接口,原因:实现该接口后,元素才有比较的方式。
2.2
TreeSet底层是红黑树结构(这里就不扩充了),TreeSet集合是怎样添加元素的了?
当把一个对象添加到TreeSet集合中时,TreeSet集合调用被添加对象的compareTo方法
与容器中其他对象比较大小,然后根据红黑树算法决定其存储位置。如果两个对象通过
compareTo比较相等,TreeSet则认为它们因处于同一位置。
2.3
类型转换异常的解决办法- import java.util.*;
- class Person implements Comparable//实现Compareable接口
- {
- private String name;
- Person(String name){
- this.name = name;
- }
- public String getName(){
- return this.name;
- }
- public String toString(){
- return "person:"+name;
- }
- public int compareTo(Object o1){ //必须覆盖compareTo方法
- return -1;
- }
- }
- class Student extends Person{
- Student(String name) {
- super(name);
- }
- }
- class GenericDemo3
- {
- public static void main(String[] args) {
- TreeSet<Student> ts = new TreeSet<Student>();
- ts.add(new Student("lisi01"));
- ts.add(new Student("lisi02"));
- ts.add(new Student("lisi03"));
- Comparator com = ts.comparator();
- System.out.println(com);//返回对象所用的比较器
- Iterator<Student> it = ts.iterator();//返回迭代器
- while (it.hasNext()) {
- System.out.println(it.next().getName());//迭代集合元素
- }
- }
- }
复制代码 解决方案是实现Compareable接口,实现compareTo方法。
但是这里要注意的是:
没有实现compareable接口时,怎么还是能添加一个元素 new Student("lisi01")?
原因很简单:
add 方法详解:
将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。更确切地讲,如果该 set 不包含满足 (e==null ? e2==null : e.equals(e2)) 的元素 e2,则将指定元素 e 添加到此 set 中。如果此 set 已经包含这样的元素,则该调用不改变此 set 并返回 false。
因为刚开始的集合为空,添加第一个元素时,元素e2 为空引用,所以能添加进集合中。当再次添加时,add(new Student("lisi02")),调用完对象的equals方法后,会接着调用对象的compareTo方法决定第二个元素的位置。由于没有实现compareable接口,自然会出现上述类型转换异常。
希望能帮到你
TreeSet集合没有写的很详细,很多细节性的东西楼主还需自己体会。
这里只分析了出错的原因。
|