0

我在线程“main”java.lang.ClassCastException 中不断收到异常:studentscoresapp.Student cannot be cast to java.lang.Comparable 我无法弄清楚原因。也许有人可以看看并告诉我我在哪里搞砸了。我已经搞砸了几个小时,似乎我让程序变得更糟,而且我在网上找到的任何东西似乎都不起作用。谢谢

public class Student implements IComparable<Student>
{
    private String lastName;
    private String firstName;
    private int score;

    public Student(String lastName, String firstName, int score)
    {
        this.lastName = lastName;
        this.firstName = firstName;
        this.score = score;
    }

    /**
     * @return the lastName
     */
    public String getLastName() {
        return lastName;
    }

    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * @return the score
     */
    public int getScore() {
        return score;
    }

    /**
     * @param score the score to set
     */
    public void setScore(int score) {
    this.score = score;
    }

    @Override
    public int compareTo(Object obj)
        {
        Student i = (Student) obj;
        if (i.lastName.equals(lastName)) {
            return firstName.compareToIgnoreCase(i.firstName);
        } else {
            return lastName.compareToIgnoreCase(i.lastName);
        }
    }

}

我的 compareTo 界面覆盖

public interface IComparable<E> {
    int compareTo(Object object);
}

和学生评分应用

public class StudentScoresApp {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // Welcome message
        System.out.println("Welcome to the Student Scores Application.");
        System.out.println();
        int count = ConsoleValidator.getInt("Enter number of students to enter: ", 0);
        Student[] student = new Student[count];
        for (int j = 0; count > j; j++)
        {
            student[j] = getItem();
            System.out.println();
        }
        Arrays.sort(student);
        for (Student i : student)
        {
            System.out.println(i.getLastName() + " " + i.getFirstName() + ": " + i.getScore() + "\n");
        }
    }
    public static Student getItem()
    {
        String name = ConsoleValidator.getString("Student first name: ");
        String last = ConsoleValidator.getString("Student last name: ");
        int score = ConsoleValidator.getInt("Student score: ", 0);
        Student j = new Student(name,last,score);
        return j;
}

}

4

4 回答 4

8

例外可能来自这条线。

Arrays.sort(student);

在内部 Arrays.sort() 将尝试将传递数组的元素转换为 Comparable,这样它就可以调用它们的 compareTo() 方法。这就是为什么你会得到一个类转换异常。

学生必须实现 Comparable。不要使用您自己的IComparable接口,而是使用java.lang.Comparable

于 2013-07-06T02:58:26.753 回答
1

虽然,您应该Comparable按照自己编写的方式使用标准接口,这也是有缺陷的。它尝试使用泛型,但在声明方法时放弃了它。正确的实现应该是

public interface IComparable<T> { // Use of T for types recommended
    int compareTo(T object); // Use the generic type for method as well
}

也使用标准java.lang.Comparable接口,您应该使用泛型,例如

public class Student implements Comparable<Student> {
  // ...
  public int compareTo(Student obj) { // No need for casting now
    if (obj.lastName.equals(lastName)) {
        return firstName.compareToIgnoreCase(obj.firstName);
    } else {
        return lastName.compareToIgnoreCase(obj.lastName);
    }
  }
}
于 2013-07-06T03:07:34.823 回答
1

对于 Array.sort() 方法,有这样的描述:
'数组中的所有元素都必须实现 Comparable 接口'。
您创建接口 IComparable 而不是 Comparable。
我认为这是不正确的。
我将界面更改为 Comparable,它可以工作。

任何意见感谢分享。

问候,
汉克斯。

于 2013-07-06T03:08:38.540 回答
1

您想如何对学生进行排序,这是我们如何根据学生的分数对学生进行排序在此处输入代码

First,Convert Student class into List<Student<String, String, Integer>> studentList

然后使用这段代码

Collections.sort(studentList, new Comparator<Student>()  
    {
          public int compare(Student c1, Student c2)
          {
            if (c1.getScore() < c2.getScore()) 
                return -1;
            if (c1.getScore() > c2.getScore()) 
                return 1;
            return 0;
          }
    });

这将根据分数按升序对排序的 studentList 列表进行排序。

于 2014-02-13T05:18:36.757 回答