不能使抽象超类的非抽象子类?

时间:2013-11-19 22:24:46

标签: java oop inheritance compiler-errors abstract

我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,指出我的类不是抽象的。我无法弄清楚为什么会抛出这个错误。

我得到的具体错误是

  

PhoneBookEntry.java:1:错误:PhoneBookEntry不是抽象的,并且不会覆盖Comparable中的抽象方法compareTo(Object)

我的问题代码:

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);
   }

}

5 个答案:

答案 0 :(得分:10)

这是问题所在:

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

您已经指定您只是实现了原始类型Comparable,它具有签名为:

的方法
int compareTo(Object)

最简单的解决方法是将PhoneNumber的声明更改为:

public abstract class PhoneNumber implements Comparable<PhoneNumber>

可以实施compareTo(Object),但您真的希望能够将电话号码与任何其他对象进行比较吗?声称能够将电话号码与其他电话号码进行比较更有意义(IMO)。

答案 1 :(得分:3)

您正在实施Comparable的原始版本,其compareTo方法需要Object

实现Comparable的通用版本:

public abstract class PhoneNumber implements Comparable<PhoneNumber>

答案 2 :(得分:1)

变化:

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

   @Override
   public int compareTo(Object other)
   {
      return super.compareTo((PhoneNumber)other);
   }

答案 3 :(得分:1)

那是因为

Comparable.compareTo(Object o); {} 

不等于

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

更改

public abstract class PhoneNumber implements Comparable

public abstract class PhoneNumber implements Comparable<PhoneNumber>

它将以你想要的TypeSafe方式工作。

答案 4 :(得分:1)

  

不会覆盖Comparable中的抽象方法compareTo(Object)

您的子类没有compareTo(Object)您可以添加这样的方法,但最佳解决方案是更改

public abstract class PhoneNumber implements Comparable<PhoneNumber> {

这样它期望compareTo(PhoneNumber)就是你所拥有的。