《java核心技术1》6-1 ClassCastException

163 阅读1分钟

Comparable.java

package cm.it04;

public interface Comparable {
	int compareTo(Object other);
}

Employee.java

package cm.it04;

public class Employee implements Comparable {
  private String name;
  private double salary;

  //构造方法
  public Employee() {
  }

  public Employee(String name, double salary) {
      this.name = name;
      this.salary = salary;
  }
  
  //get,set方法
  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public double getSalary() {
      return salary;
  }

  public void setSalary(double salary) {
      this.salary = salary;
  }
  
  //重写compareTo方法
  @Override
  public int compareTo(Object otherObject) {
      Employee other = (Employee) otherObject;
      return Double.compare(salary, other.salary);
  }
}

EmployeeSortTest.java

package cm.it04;

import java.util.Arrays;

public class EmployeeSortTest {
	public static void main(String[] args) {
    	Employee[] staff = new Employee[3];
    	staff[0] = new Employee("apple", 3000);
    	staff[1] = new Employee("pear", 2000);
    	staff[2] = new Employee("banana", 4000);

    	Arrays.sort(staff);

    	for (Employee e : staff) {
        	System.out.println(e.getName() + ":" + e.getSalary());
   		}
	}
}

报错

Exception in thread "main" java.lang.ClassCastException: class cm.it04.Employee cannot be cast to class java.lang.Comparable (cm.it04.Employee is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
at java.base/java.util.Arrays.sort(Arrays.java:1249)
at cm.it04.EmployeeSortTest.main(EmployeeSortTest.java:18)

解决方法

这是类转换异常的问题。解决方法如下:

Employee.java

    public class Employee implements Comparable {
        private String name;
        private double salary;

    public Employee() {
    }

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public int compareTo(Object otherObject) {
        Employee other = (Employee) otherObject;
        double num1 = Double.compare(this.salary, other.salary);
        //salary相同的情况下按照姓名进行排序
        double num2 = num1 == 0 ? this.name.compareTo(other.name) : num1;
        return (int) num2;

    	}
}
EmployeeSortDemo.java

    import java.util.Arrays;
    import java.util.TreeSet;

    public class EmployeeSortTest {
        public static void main(String[] args) {
            TreeSet<Employee> ts = new TreeSet<Employee>();

            Employee e1 = new Employee("apple", 3000);
            Employee e2 = new Employee("pear", 2000);
            Employee e3 = new Employee("banana", 4000);

            ts.add(e1);
            ts.add(e2);
            ts.add(e3);

            for (Employee e : ts) {
                System.out.println(e.getName() + ":" + e.getSalary());
            }
        }
    }