【问题标题】:Cannot make non-abstract subclass of abstract superclass?不能创建抽象超类的非抽象子类?
【发布时间】:2013-12-03 16:53:35
【问题描述】:

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

我得到的具体错误是

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

}

【问题讨论】:

    标签: java oop inheritance compiler-errors abstract


    【解决方案1】:

    这就是问题所在:

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

    您已指定您只是在实现原始类型Comparable,它有一个带有签名的方法:

    int compareTo(Object)
    

    最干净的解决方法是将PhoneNumber 的声明更改为:

    public abstract class PhoneNumber implements Comparable<PhoneNumber>
    

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

    【讨论】:

    • 我认为这是我明显遗漏的东西。非常感谢您的帮助!
    • @user3010825 如果有帮助,请不要忘记接受 Jon 的回答 :)
    【解决方案2】:

    您正在实现Comparable 的原始版本,其compareTo 方法采用Object

    改为实现Comparable 的通用版本:

    public abstract class PhoneNumber implements Comparable<PhoneNumber>
    

    【讨论】:

      【解决方案3】:

      那是因为

      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】:

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

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

        public abstract class PhoneNumber implements Comparable<PhoneNumber> {
        

        这样它就需要compareTo(PhoneNumber),这就是你所拥有的。

        【讨论】:

          【解决方案5】:

          变化:

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

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

          【讨论】:

          • 最好把implements Comparable改成implements Comparable&lt;PhoneNumber&gt;
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-26
          • 1970-01-01
          • 2015-12-20
          • 2012-09-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多