当前位置:   article > 正文

ClassCastException:: cannot be cast to class java.lang.Comparable的处理方法

cannot be cast to class

在向数据结构如TreeSet中插入自定义的对象时,如以下代码:

public class demo {
    public static void main(String[] args) {
        TreeSet<Person> data = new TreeSet<>();
        Person person1 = new Person("Edmond",17);
        Person person2 = new Person("John",19);
        data.add(person1);
        data.add(person2);
        for(Person p : data){
            System.out.println(p);
        }
    }

    static class Person{
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

系统将会在第一次add时便进行报错:
在这里插入图片描述

原因在于当我们将数据存入TreeSet时,内部会自动进行排序,例如我们存入‘A‘,’C’, ‘B’, 打印输出时将显示’A’, ‘B’, ‘C’。因此如果我们存入的数据类型为自定义类型时,系统将不知道如何进行排序。

因此我们需要implement Comparable接口,并自己定义比较规则,示范代码如下:

public class demo {
    public static void main(String[] args) {
        TreeSet<Person> data = new TreeSet<>();
        Person person1 = new Person("Edmond",17);
        Person person2 = new Person("John",19);
        Person person3 = new Person("Tom",9);
        data.add(person1);
        data.add(person2);
        data.add(person3);
        for(Person p : data){
            System.out.println(p);
        }
    }

    static class Person implements Comparable<Person>{
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public int compareTo(Person o) {
            //this当前对象 与 o 比较
            //返回数据有三种类型:
            //整数 : 代表this当前对象较大
            //0   :  代表一样大
            //负数 : 代表this当前对象较小
            if(this.age > o.age){
                return 1;
            }else if(this.age == o.age){
                return 0;
            }
             return -1;
             //可以简写为return this.age - o.age;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

无报错,输出为:
在这里插入图片描述

总结

当遇到ClassCastException:: cannot be cast to class java.lang.Comparable,自定义的class需要implement Comparable接口,并根据需求重写compareTo方法,
其中compareTo方法返回值有三种:

        //整数 : 代表this当前对象较大
        //0   :  代表一样大
        //负数 : 代表this当前对象较小
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/305283
推荐阅读
相关标签
  

闽ICP备14008679号