当前位置: 首页 > 知识库问答 >
问题:

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

岳英锐
2023-03-14

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

我得到的具体错误是

PhoneBookEntry.java: 1:错误:PhoneBookEntry不是抽象的,并且不会覆盖可比中的抽象方法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);
   }

}

共有3个答案

解博明
2023-03-14

那是因为

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>

它会以你想要的方式工作。

马星阑
2023-03-14

您正在实现Comparable的原始版本,它的compareTo方法采用对象

改用Comparable的通用版本:

public abstract class PhoneNumber implements Comparable<PhoneNumber>
萧飞
2023-03-14

这就是问题所在:

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

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

int compareTo(Object)

对此最干净的修复是将PhoneNumber的声明更改为:

public abstract class PhoneNumber implements Comparable<PhoneNumber>

您可以实现compareTo(Object),但您真的希望能够将电话号码与任何其他对象进行比较吗?在国际海事组织(IMO)中,仅仅声称能够将一个电话号码与其他电话号码进行比较更有意义。

 类似资料:
  • 我正在尝试对扩展抽象基的类进行单元测试。以下是“类似的类”,以供说明: 下面是我正在尝试的单元测试: 当我做这个测试的时候 java.lang.NullPointerException 在中 我知道自动连线的“滤水器”没有初始化。但接下来,我只想在我的单元测试中模拟抽象的“非抽象”方法。 我该如何使用EasyMock来实现这一点呢?另外,我不知道和应该做什么。

  • 这似乎是一个基本问题。但在采访前需要澄清。 我在抽象类中有一个非抽象方法。它的具体类重写了该方法。但我想调用父类的原始方法来调用,而不是重写方法。有什么办法吗? 据我所知,没有办法调用原始方法?

  • 我查过了,发现最接近的是这个,除了我没有任何向前的声明。我在基类中只有一个纯虚函数,我在子类中实现它,如下所示: 命令H 命令cpp 数字H 数字cpp 发生文件错误: 一个dd.cpp 添加H

  • 我试图在Scala中返回抽象泛型类的子类,但它无法编译。我得到A类型的表达式不符合预期的B类型。这是我使用的代码: 创建()的签名应该是什么? 谢谢

  • 大家好,我有这个主课堂 错误:(42,8)错误:Home不是抽象的,并且不会覆盖OnFragmentInteractionListener中的onFragmentInteract(String)抽象方法 我创建了一个导航抽屉,并希望有一个新的片段来显示另一个家庭活动的内容。 Android Studio告诉我做个家。类抽象或实现抽象方法。 里面: 我那样做了,但是什么也没有改变。我不能让home类

  • 是否有任何JAXB绑定可以告诉JAXB代码生成器将Java类生成为,而不必在XSD中将相应的XML类型标记为? 情况如下: > 我在xsd中定义架构: 我使用内联JAXB绑定(“inline”==“直接在模式中”)来指示应该生成JAXB类的包(): 我使用内联JAXB绑定为我的每个复杂类型(在本例中、和)指示实现类的名称: 我从模式生成JAXB类。这导致: 我自己编写类: 使用这两个类层次结构这样