Не можете да направите неабстрактен подклас от абстрактен суперклас?

Имам подклас, който декларира всички методи в моя абстрактен суперклас, но все още ми дава грешка, че класът ми не е абстрактен. Не мога да разбера защо се появява тази грешка.

Конкретната грешка, която получавам, е

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) вместо това, но наистина ли искате да можете да сравнявате телефонен номер с всеки друг обект? Има по-голям смисъл (IMO) просто да твърдите, че можете да сравнявате телефонен номер с други телефонни номера.

person Jon Skeet    schedule 19.11.2013
comment
Реших, че е нещо очевидно, което пропускам. Благодаря ви много за помощта! - person user3010825; 20.11.2013
comment
@user3010825 не забравяйте да приемете отговора на Jon, ако е помогнал :) - 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>

и ще работи по TypeSafe начина, по който искате.

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