2014-10-16 5 views
0

я получаю сообщение об ошибке: Student не является абстрактным и не отменяет абстрактный метод CompareTo (java.lang.Object) в java.lang.ComparableПроблема реализации сравнимого интерфейса

Почему это? То, что это пытается сделать, - это взять список студентов и сравнить их с помощью GPA.

public class Student implements Comparable 
    { 
     private String name; 
     private double gpa;  
     public Student(String name, double gpa) 
     { 
      this.name = name; 
      this.gpa = gpa; 
     }  
     public String getName() 
     { 
      return name; 
     } 
     public double getGpa() 
     { 
      return gpa; 
     }  
     public String toString() 
     { 
      return "Name: " + name + " GPA: " + gpa; 
     } 
     public double compareTo(Object other) 
     { 
      Student filler = (Student)other; 
      if(this.getGpa() < filler.getGpa()) 
       return -1; 
      else if(this.getGpa() == filler.getGpa()) 
       return 0; 
      else 
       return 1; 
     }  
    } 
+0

примечание стороны, прочитать: http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt -we-use-it –

+1

'Comparable # compareTo' имеет тип возврата' int', а не 'double'. –

+0

'compareTo()' должен возвращать 'int'. Кроме того, вы должны много узнать о дженериках, чтобы использовать их с этим кодом. –

ответ

0
public double compareTo(Object other) 

должен быть

@Override 
public int compareTo(T other) 

Посмотрите на интерфейс Comparable. Для этого требуется метод, называемый compareTo, который принимает аргумент типа T (общий параметр), , который возвращает int. Созданный вами метод не реализует метод, указанный в интерфейсе, поэтому жалобщик Java жалуется.

Поскольку интерфейс Comparable обобщен, вы должны воспользоваться генериками и сделать свой класс реализуемым Comparable<Student>. Когда вы сделаете это, подпись compareTo становится:

@Override 
public int compareTo(Student other) 

Что лучше, чем сырой Object, так как вам не придется бросить, и что более важно, вы случайно не в конечном итоге проходит в то, что не является Student.

Еще одна вещь: используйте аннотацию @Override, когда вы реализуете методы из интерфейса. Предполагая, что вы используете на полпути приличных IDE, вы увидели бы ошибку, если у вас:

@Override 
public double compareTo(Object other) 

Поскольку не существует никакого метода с этой подписью в интерфейсе.

0

Чтобы ответить на ваш вопрос напрямую, вам необходимо изменить тип возврата compareTo() от double до int.

Есть также несколько других модификаций вы должны сделать, чтобы улучшить свой код:

  1. Comparable<Student> реализуют вместо того, чтобы просто Comparable. Это делает так, что вы можете написать public int compareTo(Student other) и разрешать только звонки compareTo() с другими ссылками Student.

  2. Добавить @Override аннотации перед обоими toString() и compareTo(). Эта аннотация помогает избежать некоторых распространенных ошибок, которые компилятор не может поймать.

0

compareTo метод возвращает int и не double.

Кроме того, использование аннотации Override помогает убедиться, что вы правильно выполняете метод.Таким образом изменить

public double compareTo(Object other) 

к

@Override 
public int compareTo(Object other) 
Смежные вопросы