Не можете сделать неабстрактный подкласс абстрактного суперкласса?

У меня есть подкласс, который объявляет все методы в моем абстрактном суперклассе, но все равно выдает ошибку, утверждающую, что мой класс не является абстрактным. Не могу понять, почему вылетает эта ошибка.

Конкретная ошибка, которую я получаю,

PhoneBookEntry.java:1: ошибка: PhoneBookEntry не является абстрактным и не переопределяет абстрактный метод compareTo(Object) в Comparable

Мой рассматриваемый код:

public abstract class PhoneNumber implements Comparable
{
   protected String firstName, lastName;
   protected int number;

   public PhoneNumber(String firstName, String lastName, int number)
   {
      this.firstName = firstName;
      this.lastName = lastName;
      this.number = number;
   }

   public abstract String getLastName();
   public abstract String getFirstName();
   public abstract int getNumber();

   public int compareTo(PhoneNumber other)
   {
      int last = other.lastName.compareTo(lastName);
      int first = other.firstName.compareTo(firstName);
      int num = other.number - number;
      if(last > 0)
         return 1;
      else if(last < 0)
         return -1;
      else
         if(first > 0)
            return 1;
         else if(first < 0)
            return -1;
         else
            if(num > 0)
               return 1;
            else if(num < 0)
               return -1;
            else 
               return 0;
   }
}

И мой подкласс:

public class PhoneBookEntry extends PhoneNumber
{
   public PhoneBookEntry(String firstName, String lastName, int number)
   {
      super(firstName, lastName, number);
   }

    public String getLastName()
   {
      return lastName;
   }
   public String getFirstName()
   {
      return firstName;
   }
   public int getNumber()
   {
      return number;
   }

   public int compareTo(PhoneNumber other)
   {
      super.compareTo(other);
   }

}

person user3010825    schedule 19.11.2013    source источник


Ответы (5)


Это проблема:

public int compareTo(PhoneNumber other)
{
   super.compareTo(other);
}

Вы указали, что просто реализуете необработанный тип Comparable, у которого есть метод с сигнатурой:

int compareTo(Object)

Самое чистое исправление для этого - изменить объявление PhoneNumber на:

public abstract class PhoneNumber implements Comparable<PhoneNumber>

Вместо этого вы могли бы реализовать compareTo(Object), но действительно ли вы хотите иметь возможность сравнивать номер телефона с любым другим объектом? Более разумно (ИМО) просто заявить, что у вас есть возможность сравнить номер телефона с другими телефонными номерами.

person Jon Skeet    schedule 19.11.2013
comment
Я подумал, что это было что-то очевидное, что мне не хватало. Большое спасибо за Вашу помощь! - person user3010825; 20.11.2013
comment
@user3010825 user3010825 не забудьте принять ответ Джона, если он помог :) - person drrob; 19.08.2015

Вы реализуете необработанную версию Comparable, чей метод compareTo принимает Object.

Вместо этого реализуйте общую версию Comparable:

public abstract class PhoneNumber implements Comparable<PhoneNumber>
person rgettman    schedule 19.11.2013

Это потому, что

Comparable.compareTo(Object o); {} 

не равно

   public int compareTo(PhoneNumber other)
   {
      super.compareTo(other);
   }

Изменять

public abstract class PhoneNumber implements Comparable

to

public abstract class PhoneNumber implements Comparable<PhoneNumber>

и он будет работать так, как вы этого хотите.

person Community    schedule 19.11.2013

не переопределяет абстрактный метод compareTo(Object) в Comparable

В вашем подклассе нет compareTo(Object). Вы можете добавить такой метод, но лучше всего изменить

public abstract class PhoneNumber implements Comparable<PhoneNumber> {

таким образом, он ожидает compareTo(PhoneNumber), который у вас есть.

person Peter Lawrey    schedule 19.11.2013

Изменять:

   public int compareTo(PhoneNumber other)
   {
      super.compareTo(other);
   }

to

   @Override
   public int compareTo(Object other)
   {
      return super.compareTo((PhoneNumber)other);
   }
person user987339    schedule 19.11.2013
comment
Лучше поменять implements Comparable на implements Comparable<PhoneNumber> - person DaveJohnston; 20.11.2013