我一直在线程“main”java.lang.ClassCastException中得到Exception:studentscoresapp.Student无法强制转换为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;
}
}
答案 0 :(得分:8)
异常可能来自这一行。
Arrays.sort(student);
内部Arrays.sort()将尝试将传递的数组的元素转换为Comparable,这样它就可以调用它们的compareTo()方法。这就是你得到一个类强制转换异常的原因。
学生必须实施可比较。请勿使用您自己的 IComparable 界面,而应使用 java.lang.Comparable 。
答案 1 :(得分: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);
}
}
}
答案 2 :(得分:1)
对于方法Array.sort(),有一个描述为:
'数组中的所有元素都必须实现Comparable接口'
您可以创建IComparable接口而不是Comparable
我认为这是不正确的
我将界面更改为Comparable,它可以工作。
感谢您的分享。
的问候,
汉克斯。
答案 3 :(得分: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列表进行排序。