Ошибка Java ClassCastException с интерфейсом Comparable, несмотря на реализацию

Я работаю над заданием класса, которое принимает фамилию, имя и балл для одного или нескольких учеников, сохраняет их в массиве, а затем сортирует в алфавитном порядке по фамилии (или имени, если фамилия такая же). Нам необходимо использовать класс Student, который реализует интерфейс Comparable. Как только я добираюсь до части кода Arrays.sort, я получаю ClassCastException, в котором говорится, что «Студент не может быть приведен к java.lang.Comparable». Я искал и просматривал, пытался использовать implements Comparable<Student>, Очистить и построить, но ошибка не устранена. Любая помощь или подсказки приветствуются.

Ошибка:

Exception in thread "main" java.lang.ClassCastException:
studentscoreapp.Student cannot be cast to java.lang.Comparable
at java.util.Arrays.mergeSort(Arrays.java:1144)
at java.util.Arrays.sort(Arrays.java:1079)
at studentscoreapp.StudentScoreApp.main(StudentScoreApp.java:35)
Java Result: 1 BUILD SUCCESSFUL (total time: 12 seconds)

Вот мой студенческий класс:

public class Student implements Comparable
{

private String lastName;
private String firstName;
private int score;

public Student(String fName, String lName, int s)
    {
    fName = firstName;
    lName = lastName;
    s = score;
    }

public String getLastName()
    {
    return lastName;
    }

public void setLastName(String lastName)
    {
    this.lastName = lastName;
    }

public String getFirstName()
    {
    return firstName;
    }

public void setFirstName(String firstName)
    {
    this.firstName = firstName;
    }

public int getScore()
    {
    return score;
    }

public void setScore(int score)
    {
    this.score = score;
    }

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

@Override
public String toString()
    {
    return lastName + firstName + score;
    }
}

Сопоставимый интерфейс:

public interface Comparable
{

int compareTo(Object obj);
}

и мой основной:

import java.util.Arrays;

открытый класс StudentScoreApp {

public static void main(String[] args)
    {
    String firstName;
    String lastName;
    int score;

    System.out.println("Welcome to the Student Scores Application");
    int numStudents = Validation.getInt("Enter # of Students: ");
    Student[] studentArray = new Student[numStudents];

    int i;
    for (i = 0; i < numStudents; i++)
        {
        firstName = Validation.getString("Student [" + (i + 1) + "] first name: ");
        lastName = Validation.getString("Student [" + (i + 1) + "] last name: ");
        score = Validation.getInt("Student [" + (i + 1) + "] score: ", 0, 100);
        studentArray[i] = new Student(firstName, lastName, score);
        }


    Arrays.sort(studentArray); //line 35

    System.out.println();

    //take each obj of the array and print the student info
    for (Student obj : studentArray)
        {
        System.out.println(obj.toString());
        }

    }
}

person user2971045    schedule 09.11.2013    source источник
comment
Первое, что нужно усвоить, это то, что трассировка стека является наиболее важной частью диагностической/криминалистической информации. Вы должны включить трассировку стека в свой вопрос.   -  person JimN    schedule 09.11.2013
comment
Для дальнейшего использования вы можете / должны отредактировать свой вопрос, чтобы добавить дополнительную информацию (например, трассировку стека).   -  person JimN    schedule 12.11.2013
comment
Спасибо, Джим. Я добавил трассировку стека к вопросу после того, как разместил его здесь в качестве комментария. Чтобы избежать дублирования и путаницы, я удаляю его из предыдущего комментария.   -  person user2971045    schedule 15.11.2013


Ответы (1)


Arrays.sort() принимает массив объектов, которые являются подтипами java.lang.Comparable. В своем коде вы создали свой собственный интерфейс Comparable, который, хотя и ведет себя так же, как java.lang.Comparable, не является тем же самым интерфейсом.

person JimN    schedule 09.11.2013
comment
Итак, как мне сделать так, чтобы он использовал мой интерфейс? (и спасибо ;) - person user2971045; 09.11.2013
comment
@user2971045 user2971045 Нет. Вы переключаетесь на интерфейс java Comparable - person Tyler; 09.11.2013
comment
Я думаю, мне нужно уточнить требования к заданию с моим учителем. Нам сказали создать интерфейс Comparable, реализовать его в классе Student и переопределить метод compareTo для нашей собственной сортировки. Спасибо за вашу помощь, @Tyler и JimN. - person user2971045; 09.11.2013
comment
@user2971045 user2971045 Похоже, ваш учитель хочет, чтобы вы реализовали свой собственный вид вместо того, чтобы использовать встроенный. - person Tyler; 09.11.2013